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>

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'"

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>

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>

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>

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']">

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};
    }

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>
  (...)


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>

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'"

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.


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;
  }

4

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

[class.yourClass]="YourCondition"

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>

4

C'est ce qui a fonctionné pour moi:

[ngClass]="{'active': dashboardComponent.selected_menu == 'profile'}"

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!


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]


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'}"

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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.