clase ng en Angular2
Estoy desarrollando una aplicación de prueba en angular 2 y estoy atascado con un problema de agregar clases basadas en la lista del modelo.
En Angular 1 uno podría hacer:
// model
$scope.myClasses = ['class1', 'class2', ...];
// view
... ng-class="myClasses" ...
En Angular 2, todo lo que he podido hacer hasta ahora es:
// view
... [class.class1]="true" [class.class2]="true" ...
Que obviamente no es muy dinámico y estoy seguro de que debe haber una mejor manera de hacer esto.
Sin embargo, también he intentado:
// model
class ... {
private myClasses: any;
constructor() {
this.myClasses = ['class1', 'class2', ...];
}
// view
... [class]="myClasses" ...
Pero esto no funciona, he intentado myClasses
como un nombre de cadena de una sola clase, matriz de cadenas, objeto con una clave classname y true como valor, una matriz de objetos de este tipo, pero lamentablemente, nada de listed funcionará de esta manera.
5 answers
Debe especificar CSSClass
en directives
propiedad de @View
decorador. Echa un vistazo a este plunk .
@Component({
selector: 'app',
})
@View({
template: '<div [class]="classMap">Class Map</div>',
directives: [CSSClass]
})
class App {
constructor() {
this.classMap = { 'class1': true, 'class2': false };
setInterval(() => {
this.classMap.class2 = !this.classMap.class2;
}, 1000)
}
}
UPD
CSSClass
fue renombrado a NgClass
en alfa-35. Ver este plunk
@Component({
selector: 'app',
})
@View({
directives: [NgClass],
template: `
<div [ng-class]="classMap">Class Map</div>
`,
})
class App { /* ... */ }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 12:13:44
De acuerdo con los documentos de la API de ngClass , Angular 2 aceptará una cadena, una matriz o un Objeto/mapa como expresión para ngClass. O, por supuesto, podría especificar una función que devuelve uno de esos.
import {Component, CORE_DIRECTIVES} from 'angular2/angular2'
@Component({
selector: 'my-app',
directives: [CORE_DIRECTIVES],
template: `
<div>
<h2>{{title}}</h2>
<div ngClass="gray-border purple">string of classes</div>
<div [ngClass]="'gray-border purple'">string of classes</div>
<div [ngClass]="['gray-border', 'green']">array of classes</div>
<div [ngClass]="{'gray-border': true, 'blue': true}">object/map of classes</div>
<button [ngClass]="{active: isActive}" (click)="isActive = !isActive">Click me</button>
</div>
`,
styles: [`
.gray-border { border: 1px solid gray; }
.blue { color: blue; }
.green { color: green; }
.purple { color: purple; }
.active { background-color: #f55; }
`]
})
export class App {
title = "Angular 2 - NgClass";
isActive = false;
}
Si está pasando una cadena literal, tenga en cuenta las dos sintaxis alternativas:
<div ngClass="gray-border purple">string of classes</div>
<div [ngClass]="'gray-border purple'">string of classes</div>
Creo que el primero es solo azúcar sintáctico para el segundo.
Y para citar los documentos:
Mientras que la ngClass directiva puede interpretar expresiones que evalúan a string, Array u Objeto, la versión basada en objetos es la más frecuente usado y tiene la ventaja de mantener todos los nombres de clase CSS en un plantilla.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-07 14:31:38
Un método más [Usando Operador Ternario e Interpolación]
(Aunque Mark Rajcok
indica todos los métodos posibles ngClass
, pero se puede acoplar con ternary operator
y se obtiene else
condiciones)
Plantilla
<div class="hard-coded-class {{classCondition ? 'c1 c2': 'c3 c4'}}">
Conditional classes using <b>Ternary Operator</b>
</div>
o utilice ternary operator
con ngClass
, ver cómo
TS
export class App {
this.classCondition = false;
}
Resultado
<div class="hard-coded-class c3 c4">
Conditional classes using <b>Ternary Operator</b>
</div>
Espero que ayude a alguien.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:30
Usando typescript y Angular 2 beta, ngClass no parece funcionar. Desde seguir la vista previa de la API - https://angular.io/docs/ts/latest/api/common/NgClass-directive.html
template: '<div [ngClass]="classMap">Class Map</div>'
El ejemplo de Google proporciona dos versiones de código (que supongo que es Alfa y actualizado a Beta). La nueva sintaxis en el ejemplo del sitio web no parece funcionar... alguna idea?
@View({
template: `
<div class="container questions">
<div class="row formSection">
<h2>
<div [ngClass]="completed">completed</div>
</h2>
<questionSection></questionSection>
</div>
</div>
`,
directives: [NgClass, QuestionSection],
})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-22 02:34:57
Estaba tratando de hacer algo similar, tenía una lista de elementos de menú y quería especificar una clase fontawesome para cada elemento. Así es como lo hice funcionar. En mi componente typescript tenía esto:
export class AppCmp {
menuItems = [
{
text: 'Editor',
icon: 'fa fa-pencil'
},
{
text: 'Account',
icon: 'fa fa-user'
},
{
text: 'Catalog',
icon: 'fa fa-list'
}
]
}
Luego en mi html:
<div *ngFor="#item of menuItems; #index = index">
<i [attr.class]="item.icon"></i>
<span>{{ item.text }}</span>
</div>
Aquí está el émbolo, https://plnkr.co/edit/PIDRZsc7ZhISNgZzOWuY?p=preview Esperanza que ayuda
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 15:14:43