Angulaire: classe conditionnelle avec * ngClass

562

Quel est le problème avec mon code angulaire? Je reçois:

Cannot read property 'remove' of undefined at BrowserDomAdapter.removeClass ...

HTML

<ol class="breadcrumb">
    <li *ngClass="{active: step==='step1'}" (click)="step='step1; '">Step1</li>
    <li *ngClass="{active: step==='step2'}"  (click)="step='step2'">Step2</li>
    <li *ngClass="{active: step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
daniel
la source

Réponses:

1230

La version angulaire 2, ..., 9 propose plusieurs façons d'ajouter des classes conditionnellement:

taper un

[class.my-class]="step === 'step1'"

taper deux

[ngClass]="{'my-class': step === 'step1'}"

et plusieurs options:

[ngClass]="{'my-class': step === 'step1', 'my-class2':step === 'step2' }"

tapez trois

[ngClass]="{1:'my-class1',2:'my-class2',3:'my-class4'}[step]"

tapez quatre

[ngClass]="(step=='step1')?'my-class1':'my-class2'"
MostafaMashayekhi
la source
7
Réponse parfaite, il suffit de fixer le type 2 à: [ngClass] = "{'ma-classe': étape == 'étape1'}" Avec le '' dans le nom de la classe
Adriano Galesso Alves
2
Pour le type trois, l'ordre du nom de classe et de la vérification est incorrect. Il doit s'agir du nom de classe en premier, tel que [ngClass] = "{'my-class1': 1, 'my-class2': 2}"
obaylis
1
ressemble à "type trois" et "type quatre" sont des usages spécifiques de [ngClass]="js expression returning html class string"ce qui sont les mêmes dans ce sens
YakovL
1
Merci mec .. tu es génial
Pranav MS
1
Parfait compagnon de réponse. Merci beaucoup !
Anjana Silva
423

[ngClass]=...au lieu de *ngClass.

* est uniquement pour la syntaxe abrégée des directives structurelles où vous pouvez par exemple utiliser

<div *ngFor="let item of items">{{item}}</div>

au lieu de la version équivalente plus longue

<template ngFor let-item [ngForOf]="items">
  <div>{{item}}</div>
</template>

Voir également https://angular.io/docs/ts/latest/api/common/index/NgClass-directive.html

<some-element [ngClass]="'first second'">...</some-element>
<some-element [ngClass]="['first', 'second']">...</some-element>
<some-element [ngClass]="{'first': true, 'second': true, 'third': false}">...</some-element>
<some-element [ngClass]="stringExp|arrayExp|objExp">...</some-element>
<some-element [ngClass]="{'class1 class2 class3' : true}">...</some-element>

Voir également https://angular.io/docs/ts/latest/guide/template-syntax.html

<!-- toggle the "special" class on/off with a property -->
<div [class.special]="isSpecial">The class binding is special</div>

<!-- binding to `class.special` trumps the class attribute -->
<div class="special"
     [class.special]="!isSpecial">This one is not so special</div>
<!-- reset/override all class names with a binding  -->
<div class="bad curly special"
     [class]="badCurly">Bad curly</div>
Günter Zöchbauer
la source
1
De la documentation angulaire: "L'astérisque est" sucre syntaxique "pour quelque chose d'un peu plus compliqué. En interne, Angular traduit l'attribut * ngIf en un élément <ng-template>, enroulé autour de l'élément hôte, comme ceci. La directive * ngIf déplacé vers l'élément <ng-template> où il est devenu une liaison de propriété, [ngIf]. Le reste de <div>, y compris son attribut de classe, a été déplacé à l'intérieur de l'élément <ng-template>. " - plus d'informations @ angular.io/guide/structural-directives#the-asterisk--prefix
Combinez
En fait, ce n'est rien de plus compliqué, *permet juste une synaxie simplifiée au lieu d'une forme canonique.
Günter Zöchbauer
76

Une autre solution serait d'utiliser [class.active].

Exemple :

<ol class="breadcrumb">
    <li [class.active]="step=='step1'" (click)="step='step1'">Step1</li>
</ol>
Joel Almeida
la source
8
Je pense que cela devrait être la réponse acceptée car c'est la façon dont Angular2 définit la classe html (que je ne connaissais pas et que google m'a amené ici).
kub1x
62

C'est la structure normale pour ngClass:

[ngClass]="{'classname' : condition}"

Donc dans votre cas, utilisez-le comme ça ...

<ol class="breadcrumb">
  <li [ngClass]="{'active': step==='step1'}" (click)="step='step1'">Step1</li>
  <li [ngClass]="{'active': step==='step2'}" (click)="step='step2'">Step2</li>
  <li [ngClass]="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
Alireza
la source
48

avec les exemples suivants, vous pouvez utiliser "IF ELSE"

<p class="{{condition ? 'checkedClass' : 'uncheckedClass'}}">
<p [ngClass]="condition ? 'checkedClass' : 'uncheckedClass'">
<p [ngClass]="[condition ? 'checkedClass' : 'uncheckedClass']">
Chaitanya Nekkalapudi
la source
1
J'ai essayé la première et la deuxième solution. Seul le second a fonctionné pour moi
user1238784
36

Vous pouvez utiliser ngClass pour appliquer le nom de classe à la fois conditionnellement et non dans Angular

Par exemple

[ngClass]="'someClass'">

Conditionnel

[ngClass]="{'someClass': property1.isValid}">

Condition multiple

 [ngClass]="{'someClass': property1.isValid && property2.isValid}">

Expression de méthode

[ngClass]="getSomeClass()"

Cette méthode sera à l'intérieur de votre composant

 getSomeClass(){
        const isValid=this.property1 && this.property2;
        return {someClass1:isValid , someClass2:isValid};
    }
Code-EZ
la source
14

Vous devriez utiliser quelque chose ( [ngClass]au lieu de *ngClass) comme ça:

<ol class="breadcrumb">
  <li [ngClass]="{active: step==='step1'}" (click)="step='step1; '">Step1</li>
  (...)

Thierry Templier
la source
10

Dans Angular 7.X

Les classes CSS sont mises à jour comme suit, selon le type d'évaluation de l'expression:

  • chaîne - les classes CSS répertoriées dans la chaîne (délimitées par des espaces) sont ajoutées

  • Array - les classes CSS déclarées comme éléments Array sont ajoutées

  • Les clés d'objet sont des classes CSS qui sont ajoutées lorsque l'expression donnée dans la valeur est évaluée à une valeur vraie, sinon elles sont supprimées.

<some-element [ngClass]="'first second'">...</some-element>

<some-element [ngClass]="['first', 'second']">...</some-element>

<some-element [ngClass]="{'first': true, 'second': true, 'third': false}">...</some-element>

<some-element [ngClass]="stringExp|arrayExp|objExp">...</some-element>

<some-element [ngClass]="{'class1 class2 class3' : true}">...</some-element>
Rohit.007
la source
7

pour étendre MostafaMashayekhi sa réponse pour l'option deux> vous pouvez également chaîner plusieurs options avec un ','

[ngClass]="{'my-class': step=='step1', 'my-class2':step=='step2' }"

* NgIf peut également être utilisé dans certaines de ces situations, généralement combiné avec un * ngFor

class="mats p" *ngIf="mat=='painted'"
Robert Leeuwerink
la source
6

Pendant que je créais un formulaire réactif, j'ai dû assigner 2 types de cours sur le bouton. Voici comment je l'ai fait:

<button type="submit" class="btn" [ngClass]="(formGroup.valid)?'btn-info':''" 
[disabled]="!formGroup.valid">Sign in</button>

Lorsque le formulaire est valide, le bouton a btn et btn-class (de bootstrap), sinon juste btn class.

Sarvar Nishonboev
la source
5

De plus, vous pouvez ajouter avec la fonction de méthode:

En HTML

<div [ngClass]="setClasses()">...</div>

Dans component.ts

// Set Dynamic Classes
  setClasses() {
    let classes = {
      constantClass: true,
      'conditional-class': this.item.id === 1
    }

    return classes;
  }
Alper BULUT
la source
4

Soit, YourCondition est votre condition ou une propriété booléenne, alors faites comme ça

[class.yourClass]="YourCondition"
Abdus Salam Azad
la source
4

ngClass syntaxe:

[ngClass]="{'classname' : conditionFlag}"

Vous pouvez utiliser comme ceci:

<ol class="breadcrumb">
  <li [ngClass]="{'active': step==='step1'}" (click)="step='step1'">Step1</li>
  <li [ngClass]="{'active': step==='step2'}" (click)="step='step2'">Step2</li>
  <li [ngClass]="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
Chirag
la source
4

C'est ce qui a fonctionné pour moi:

[ngClass]="{'active': dashboardComponent.selected_menu == 'profile'}"
Ninad Kulkarni
la source
4

Vous pouvez utiliser [ngClass] ou [class.classname], les deux fonctionneront de la même manière.
[class.my-class]="step==='step1'"

   OU

[ngClass]="{'my-class': step=='step1'}"

Les deux fonctionneront de la même façon!

Waleed Shahzaib
la source
1

Pas pertinent avec la [ngClass]directive mais j'obtenais également la même erreur que

Impossible de lire la propriété «supprimer» de non défini à ...

et je pensais que c'était l'erreur dans mon [ngClass]état mais il s'est avéré que la propriété à laquelle j'essayais d'accéder dans l'état [ngClass]n'était pas initialisée.

Comme je l'avais dans mon fichier dactylographié

element: {type: string};

et dans mon [ngClass]j'utilisais

[ngClass]="{'active', element.type === 'active'}"

et j'obtenais l'erreur

Impossible de lire la propriété 'type' non définie à ...

et la solution a été de réparer ma propriété

element: {type: string} = {type: 'active'};

J'espère que cela aide quelqu'un qui essaie de faire correspondre l'état d'une propriété [ngClass]

Hamza Khanzada
la source
1

<div class="collapse in " [ngClass]="(active_tab=='assignservice' || active_tab=='manage')?'show':''" id="collapseExampleOrganization" aria-expanded="true" style="">
 <ul> 	 <li class="nav-item" [ngClass]="{'active': active_tab=='manage'}">
<a routerLink="/main/organization/manage" (click)="activemenu('manage')"> <i class="la la-building-o"></i>
<p>Manage</p></a></li> 
<li class="nav-item" [ngClass]="{'active': active_tab=='assignservice'}"><a routerLink="/main/organization/assignservice" (click)="activemenu('assignservice')"><i class="la la-user"></i><p>Add organization</p></a></li>
</ul></div>

Le code est un bon exemple de ngClass si la condition else.

[ngClass]="(active_tab=='assignservice' || active_tab=='manage')?'show':''"

[ngClass]="{'active': active_tab=='assignservice'}"
amarbhanu
la source
0

Essayez comme ça ..

Définissez votre classe avec ''

<ol class="breadcrumb">
    <li *ngClass="{'active': step==='step1'}" (click)="step='step1; '">Step1</li>
    <li *ngClass="{'active': step==='step2'}"  (click)="step='step2'">Step2</li>
    <li *ngClass="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
Aishwarya Kathavarayan
la source