Angular: kelas kondisional dengan * ngClass

562

Apa yang salah dengan kode sudut saya? Saya mendapatkan:

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
sumber

Jawaban:

1230

Versi sudut 2, ..., 9 menyediakan beberapa cara untuk menambahkan kelas secara kondisional:

ketik satu

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

ketik dua

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

dan beberapa opsi:

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

tipe tiga

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

ketik empat

[ngClass]="(step=='step1')?'my-class1':'my-class2'"
MostafaMashayekhi
sumber
7
Jawaban sempurna, cukup perbaiki tipe 2 ke: [ngClass] = "{'my-class': step == 'step1'}" Dengan '' int nama kelas
Adriano Galesso Alves
2
Untuk tipe tiga, urutan nama kelas dan periksa salah. Itu haruslah nama kelas terlebih dahulu seperti [ngClass] = "{'my-class1': 1, 'my-class2': 2}"
obaylis
1
sepertinya "tipe tiga" dan "tipe empat" adalah penggunaan khusus [ngClass]="js expression returning html class string"sehingga sama dalam hal ini
YakovL
1
Terima kasih kawan .. kamu luar biasa
Pranav MS
1
Teman jawaban yang sempurna. Terima kasih banyak !
Anjana Silva
423

[ngClass]=...bukannya *ngClass.

* hanya untuk sintaks steno untuk arahan struktural di mana Anda dapat misalnya digunakan

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

alih-alih versi yang lebih lama

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

Lihat juga 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>

Lihat juga 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
sumber
1
Dari dokumentasi bersudut: "Tanda bintang adalah" gula sintaksis "untuk sesuatu yang sedikit lebih rumit. Secara internal, Angular menerjemahkan atribut * ngIf menjadi elemen <ng-template>, melilitkan elemen host, seperti ini. Arahan * ngIf dipindahkan ke elemen <ng-template> di mana ia menjadi properti yang mengikat, [ngIf]. Sisa dari <div>, termasuk atribut kelasnya, dipindahkan ke dalam elemen <ng-template>. " - info lebih lanjut @ angular.io/guide/structural-directives#the-asterisk--prefix
Combine
Sebenarnya, tidak ada yang lebih rumit, *hanya memungkinkan synax disederhanakan daripada bentuk kanonis.
Günter Zöchbauer
75

Solusi lain akan digunakan [class.active].

Contoh:

<ol class="breadcrumb">
    <li [class.active]="step=='step1'" (click)="step='step1'">Step1</li>
</ol>
Joel Almeida
sumber
8
Saya pikir ini harus menjadi jawaban yang diterima karena ini adalah cara Angular2 untuk mengatur kelas html (yang saya tidak tahu dan google membawa saya ke sini).
kub1x
62

Itulah struktur normal untuk ngClassadalah:

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

Jadi dalam kasus Anda, gunakan saja seperti ini ...

<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
sumber
48

dengan contoh-contoh berikut, Anda dapat menggunakan 'JIKA LAIN'

<p class="{{condition ? 'checkedClass' : 'uncheckedClass'}}">
<p [ngClass]="condition ? 'checkedClass' : 'uncheckedClass'">
<p [ngClass]="[condition ? 'checkedClass' : 'uncheckedClass']">
Chaitanya Nekkalapudi
sumber
1
Saya mencoba solusi pertama dan kedua. Hanya yang kedua bekerja untuk saya
user1238784
36

Anda dapat menggunakan ngClass untuk menerapkan nama kelas baik kondisional dan bukan di Angular

Sebagai contoh

[ngClass]="'someClass'">

Bersyarat

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

Beberapa kondisi

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

Ekspresi metode

[ngClass]="getSomeClass()"

Metode ini akan berada di dalam komponen Anda

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

Anda harus menggunakan sesuatu ( [ngClass]bukan *ngClass) seperti itu:

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

Thierry Templier
sumber
10

Di Angular 7.X

Kelas CSS diperbarui sebagai berikut, tergantung pada jenis evaluasi ekspresi:

  • string - kelas CSS yang tercantum dalam string (dibatasi ruang) ditambahkan

  • Array - kelas CSS yang dideklarasikan sebagai elemen Array ditambahkan

  • Objek - kunci adalah kelas CSS yang ditambahkan ketika ekspresi yang diberikan dalam nilai mengevaluasi ke nilai yang sebenarnya, jika tidak mereka akan dihapus.

<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
sumber
7

untuk memperluas jawaban MostafaMashayekhi untuk opsi dua> Anda juga dapat membuat beberapa opsi dengan ','

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

Juga * ngIf dapat digunakan dalam beberapa situasi ini biasanya dikombinasikan dengan * ngFor

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

Sementara saya membuat formulir reaktif, saya harus menetapkan 2 jenis kelas pada tombol. Beginilah cara saya melakukannya:

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

Ketika form valid, tombol memiliki btn dan btn-class (dari bootstrap), jika tidak hanya btn class.

Sarvar Nishonboev
sumber
5

Selain itu, Anda dapat menambahkan dengan fungsi metode:

Dalam HTML

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

Dalam component.ts

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

    return classes;
  }
Alper BULUT
sumber
4

Biarkan, YourCondition adalah kondisi Anda atau properti boolean, maka lakukan seperti ini

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

ngClass sintaksis:

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

Anda bisa menggunakan seperti ini:

<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
sumber
4

Inilah yang bekerja untuk saya:

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

Anda dapat menggunakan [ngClass] atau [class.classname], keduanya akan bekerja sama.
[class.my-class]="step==='step1'"

   ATAU

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

Keduanya akan bekerja sama!

Waleed Shahzaib
sumber
1

Tidak relevan dengan [ngClass]arahan tetapi saya juga mendapatkan kesalahan yang sama seperti

Tidak dapat membaca properti 'hapus' dari undefined di ...

dan saya dianggap kesalahan dalam [ngClass]kondisi saya tetapi ternyata properti yang saya coba akses dalam kondisi [ngClass]tidak diinisialisasi.

Seperti saya punya ini di file naskah saya

element: {type: string};

dan di saya [ngClass]saya gunakan

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

dan saya mendapatkan kesalahan

Tidak dapat membaca properti 'tipe' tidak terdefinisi di ...

dan solusinya adalah memperbaiki properti saya

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

Semoga ini bisa membantu seseorang yang mencoba mencocokkan kondisi sebuah properti di [ngClass]

Hamza Khanzada
sumber
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>

Kode adalah contoh yang baik dari ngClass jika kondisi lain.

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

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

Coba Seperti ini ..

Tentukan kelas Anda dengan ''

<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
sumber