87 votes

Différence entre les liaisons [ngClass] et [class].

Quelle est la différence dans Angular 2 entre les extraits suivants :

<div [class.extra-sparkle]="isDelightful">
<div [ngClass]="{'extra-sparkle': isDelightful}">

0 votes

Il est intéressant de noter qu'il existe également une [className] qui peut être utilisé comme suit <div [className]="isDelightful ? 'extra-sparkle'"> .

2 votes

N'auriez-vous pas besoin de compléter le ternaire avec un : ? Sinon, l'utilisation de && à la place de ? sera valide.

78voto

Günter Zöchbauer Points 21340

Il s'agit de la syntaxe spéciale de liaison Angular

<div [class.extra-sparkle]="isDelightful">

Cela fait partie du compilateur Angular et vous ne pouvez pas créer une variante de liaison personnalisée suivant ce style de liaison. Les seules liaisons prises en charge sont [class.xxx]="..." , [style.xxx]="..." et [attr.xxx]="..."

ngClass est une directive Angular normale comme vous pouvez la construire vous-même

<div [ngClass]="{'extra-sparkle': isDelightful}">

ngClass est plus puissant. Il vous permet de lier une chaîne de classes, un tableau de chaînes de caractères ou un objet comme dans votre exemple.

1 votes

Ah donc, dans la documentation, lorsque l'on dit <div [attr.role]="myAriaRole">, on lie l'attribut role de la div et non l'attribut role d'un objet appelé attr dans le contrôleur. C'est plus clair, merci.

3 votes

attr.foo sert à lier des attributs au lieu de propriétés. Voir stackoverflow.com/questions/6003819/ . @Input() des composants et directives Angular sont traités comme des propriétés. La liaison aux attributs ne prend en charge que les valeurs de type chaîne, tandis que les attributs prennent en charge tout type de valeur. S'il existe un @Input() avec un nom correspondant utilisé pour lier l'attribut, la valeur sera également transmise à l'objet @Input() . Si vous vous liez à un attribut natif d'un élément (tel que for sur <label> Dans ce cas, le navigateur a sa propre implémentation de la manière dont la valeur est reflétée dans la propriété.

1 votes

Merci, bien que je pense que "Binding to attributes only supports string values, attributes support any kind of value." a peut-être été mal saisi ?

29voto

Hameed Syed Points 1201

Les deux lignes de code ci-dessus sont relatives à CSS class liaison dans Angular. Il existe essentiellement 2 ou 3 façons de lier une classe css à un composant Angular.

Vous fournissez un nom de classe avec class.className entre parenthèses dans vos modèles, puis une expression à droite qui doit être évaluée à true ou false pour déterminer si la classe doit être appliquée. C'est le cas de l'exemple ci-dessous, où extra-sparkle(key) est la classe css et isDelightful(value) .

<div [class.extra-sparkle]="isDelightful">

Lorsque plusieurs classes devrait potentiellement être ajouté, le NgClass est très utile. NgClass doit recevoir un objet avec des noms de classe comme clés et des expressions qui valent true ou false. extra-sparkle est la clé et isDelightful est la valeur ( boolean ).

<div [ngClass]="{'extra-sparkle': isDelightful}">

Maintenant, en plus de l'éclat supplémentaire, vous pouvez scintiller votre div également.

<div [ngClass]="{'extra-sparkle': isDelightful,'extra-glitter':isGlitter}">

ou

export class AppComponent {
    isDelightful: boolean = true;
    isGlitter:  boolean = true;

    get sparkleGlitter()
    {
        let classes = {
            extra-sparkle: this.isDelightful,
            extra-glitter: this.isGlitter
        };
        return classes;
    }
}

<div [ngClass]='sparkleGlitter'>

Pour ngClass vous pouvez aussi avoir des opérateurs ternaires conditionnels.

17voto

Daniel Budzyński Points 399

Dans la version actuelle d'Angular, la syntaxe suivante fonctionne également très bien :

[class]="{toggled: sidebarActive, test: true,test1: sidebarActive}

Donc, d'après ce que j'ai compris, il n'y a pas de différence entre l'utilisation de ngClass et [class] à lier ?

Exemple

15voto

elzoy Points 1639

Utilisation de [ngClass] vous êtes en mesure d'appliquer plusieurs classes de manière très pratique. Vous pouvez même appliquer une fonction qui renverra un objet de classes. [class. vous permet de n'appliquer qu'une seule classe (bien sûr, vous pouvez utiliser class. plusieurs fois, mais cela fait vraiment mauvais effet).

8voto

FierceDev Points 317

Sur [ngClass] vous pouvez ajouter une des deux classes différentes comme ceci :

<div [ngClass]="a === b ? 'class1' : 'class2'">

2 votes

Vous pourriez également faire ceci <div class="{{a === b ? 'class1' : 'class2'}}">

10 votes

Ce comportement dans la réponse ne distingue pas [ngClass] . Vous pouvez faire de même avec [class] .

1 votes

Comme déjà mentionné la même chose peut être faite avec [class] s'il vous plaît mettez à jour votre réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X