Winkel: Bedingte Klasse mit * ngClass


562

Was ist mit meinem Angular-Code falsch? Ich bekomme:

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>

Antworten:


1227

Angular Version 2, ..., 9 bietet verschiedene Möglichkeiten, Klassen bedingt hinzuzufügen:

Typ eins

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

Typ zwei

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

und mehrere Optionen:

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

Typ drei

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

Typ vier

[ngClass]="(step=='step1')?'my-class1':'my-class2'"

7
Perfekte Antwort, korrigieren Sie einfach den Typ 2 auf: [ngClass] = "{'my-class': step == 'step1'}" Mit dem '' int im Klassennamen
— Adriano Galesso Alves

2
Für Typ drei ist die Reihenfolge des Klassennamens und der Prüfung falsch. Es sollte zuerst der Klassenname sein, z. B. [ngClass] = "{'my-class1': 1, 'my-class2': 2}"
— obaylis

1
sieht aus wie "Typ drei" und "Typ vier" sind spezifische Verwendungen von [ngClass]="js expression returning html class string", die in diesem Sinne gleich sind
— YakovL

1
Danke Mann .. du bist großartig
— Pranav MS

1
Perfekte Antwort Kumpel. Vielen Dank !
— Anjana Silva

422

[ngClass]=...statt *ngClass.

* ist nur für die Kurzsyntax für strukturelle Direktiven, wo Sie zum Beispiel verwenden können

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

anstelle der längeren äquivalenten Version

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

Siehe auch 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>

Siehe auch 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
Aus der Angular-Dokumentation: "Das Sternchen ist" syntaktischer Zucker "für etwas Komplizierteres. Intern übersetzt Angular das Attribut * ngIf in ein <ng-template> -Element, das wie folgt um das Host-Element gewickelt ist. Die Direktive * ngIf wurde in das <ng-template> -Element verschoben, wo es zu einer Eigenschaftsbindung wurde, [ngIf]. Der Rest des <div>, einschließlich seines Klassenattributs, wurde in das <ng-template> -Element verschoben. " - Weitere Informationen @ angle.io/guide/structural-directives#the-asterisk--prefix
— Kombinieren Sie

Eigentlich ist es nichts komplizierteres, *erlaubt nur eine vereinfachte Synax statt kanonischer Form.
— Günter Zöchbauer

75

Eine andere Lösung wäre die Verwendung [class.active].

Beispiel:

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

8
Ich denke, dies sollte die akzeptierte Antwort sein, da dies die Angular2-Methode ist, um die HTML-Klasse festzulegen (von der ich nichts wusste und die Google mich hierher gebracht hat).
— Kub1x

62

Das ist die normale Struktur für ngClass:

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

Verwenden Sie es in Ihrem Fall einfach so ...

<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

Mit den folgenden Beispielen können Sie 'IF ELSE' verwenden.

<p class="{{condition ? 'checkedClass' : 'uncheckedClass'}}">
<p [ngClass]="condition ? 'checkedClass' : 'uncheckedClass'">
<p [ngClass]="[condition ? 'checkedClass' : 'uncheckedClass']">

1
Ich habe die erste und die zweite Lösung ausprobiert. Nur die zweite funktionierte für mich
— user1238784

36

Sie können ngClass verwenden, um den Klassennamen sowohl bedingt als auch nicht in Angular anzuwenden

Zum Beispiel

[ngClass]="'someClass'">

Bedingt

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

Mehrfachbedingung

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

Methodenausdruck

[ngClass]="getSomeClass()"

Diese Methode wird innerhalb Ihrer Komponente

 getSomeClass(){
        const isValid=this.property1 && this.property2;
        return {someClass1:isValid , someClass2:isValid};
    }

14

Sie sollten so etwas ( [ngClass]anstelle von *ngClass) verwenden:

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


10

Im Angular 7.X

Die CSS-Klassen werden je nach Art der Ausdrucksbewertung wie folgt aktualisiert:

  • Zeichenfolge - Die in der Zeichenfolge aufgelisteten CSS-Klassen (durch Leerzeichen getrennt) werden hinzugefügt

  • Array - Die als Array-Elemente deklarierten CSS-Klassen werden hinzugefügt

  • Objektschlüssel sind CSS-Klassen, die hinzugefügt werden, wenn der im Wert angegebene Ausdruck einen wahrheitsgemäßen Wert ergibt, andernfalls werden sie entfernt.

<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

Um MostafaMashayekhi seine Antwort für Option 2 zu erweitern, können Sie auch mehrere Optionen mit einem ',' verketten

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

Außerdem kann * ngIf in einigen dieser Situationen verwendet werden, normalerweise kombiniert mit einem * ngFor

class="mats p" *ngIf="mat=='painted'"

6

Während ich ein reaktives Formular erstellte, musste ich der Schaltfläche zwei Klassentypen zuweisen. So habe ich es gemacht:

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

Wenn das Formular gültig ist, hat die Schaltfläche die BTN- und BTN-Klasse (vom Bootstrap), andernfalls nur die BTN-Klasse.


5

Zusätzlich können Sie mit Methodenfunktion hinzufügen:

In HTML

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

In component.ts

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

    return classes;
  }

4

Lassen Sie YourCondition Ihre Bedingung oder eine boolesche Eigenschaft sein, dann machen Sie es so

[class.yourClass]="YourCondition"

4

ngClass Syntax:

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

Sie können wie folgt verwenden:

<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

Das hat bei mir funktioniert:

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

4

Sie können [ngClass] oder [class.classname] verwenden, beide funktionieren gleich.
[class.my-class]="step==='step1'"

   ODER

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

Beide werden gleich funktionieren!


1

Nicht relevant mit [ngClass]Direktive, aber ich bekam auch den gleichen Fehler wie

Die Eigenschaft 'remove' von undefined at ... kann nicht gelesen werden.

und ich dachte, es sei der Fehler in meinem [ngClass]Zustand, aber es stellte sich heraus, dass die Eigenschaft, auf die ich im Zustand von zugreifen wollte, [ngClass]nicht initialisiert wurde.

Als hätte ich das in meiner Typoskriptdatei

element: {type: string};

und in meinem habe [ngClass]ich benutzt

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

und ich bekam den Fehler

Die Eigenschaft 'type' von undefined at ... kann nicht gelesen werden.

und die Lösung bestand darin, mein Eigentum zu reparieren

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

Hoffe, es hilft jemandem, der versucht, einen Zustand einer Immobilie in zu entsprechen [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>

Code ist ein gutes Beispiel für ngClass, wenn sonst Bedingung.

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

[ngClass]="{'active': active_tab=='assignservice'}"

0

Versuchen Sie wie folgt ..

Definieren Sie Ihre Klasse mit ''

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.