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>

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

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>

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>

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>

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

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

14

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

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


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>

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

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.


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

4

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

[class.yourClass]="YourCondition"

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>

4

Inilah yang bekerja untuk saya:

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

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!


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]


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

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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.