Angular: คลาสที่มีเงื่อนไขพร้อม * ngClass


562

เกิดอะไรขึ้นกับรหัสแองกูลาร์ของฉัน ฉันได้รับ:

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>

คำตอบ:


1227

เวอร์ชันเชิงมุม 2, ... , 9 ให้วิธีการเพิ่มคลาสที่มีเงื่อนไขหลายวิธี:

พิมพ์หนึ่ง

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

พิมพ์สอง

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

และหลายตัวเลือก:

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

พิมพ์สาม

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

พิมพ์สี่

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

7
คำตอบที่สมบูรณ์แบบเพียงแก้ไขประเภท 2 เป็น: [ngClass] = "{'my-class': step == 'step1'}" ด้วย '' int ชื่อคลาส
Adriano Galesso Alves

2
สำหรับประเภทที่สามลำดับของชื่อคลาสและการตรวจสอบไม่ถูกต้อง ควรเป็นชื่อคลาสก่อนเช่น [ngClass] = "{'my-class1': 1, 'my-class2': 2}"
obaylis

1
ดูเหมือนว่า "ประเภทที่สาม" และ "ประเภทสี่" เป็นประเพณีที่เฉพาะเจาะจง[ngClass]="js expression returning html class string"เพื่อที่จะเหมือนกันในความหมายนี้
35432

1
ขอบคุณผู้ชาย .. คุณยอดเยี่ยม
ปราณนาว MS

1
เพื่อนคำตอบที่สมบูรณ์แบบ ขอบคุณมาก !
Anjana Silva

422

[ngClass]=...*ngClassแทน

* เป็นเพียงสำหรับไวยากรณ์ชวเลขและคำสั่งโครงสร้างที่คุณสามารถใช้ตัวอย่างเช่น

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

แทนที่จะเป็นรุ่นที่เทียบเท่าที่ยาวกว่า

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

ดูเพิ่มเติมที่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>

ดูเพิ่มเติมที่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
จากเอกสารเชิงมุม: "เครื่องหมายดอกจันคือ" น้ำตาลเชิงซ้อน "สำหรับบางสิ่งที่ซับซ้อนกว่านี้ภายใน Angular แปลแอตทริบิวต์ * ngIf เป็นองค์ประกอบ <ng-template> ซึ่งล้อมรอบองค์ประกอบโฮสต์เช่นนี้คำสั่ง * ngIf ย้ายไปที่องค์ประกอบ <ng-template> ซึ่งกลายเป็นคุณสมบัติการรวม [ngIf] ส่วนที่เหลือของ <div> รวมถึงแอตทริบิวต์ class จะย้ายภายในองค์ประกอบ <ng-template> " - ข้อมูลเพิ่มเติม @ angular.io/guide/structural-directives#the-asterisk--prefix
รวม

ที่จริงแล้วมันไม่มีอะไรซับซ้อนมากขึ้น*เพียงแค่อนุญาตให้ synax ที่ง่ายขึ้นแทนที่จะเป็นรูปแบบปืนใหญ่
GünterZöchbauer

75

[class.active]วิธีการแก้ปัญหาอีกก็จะใช้

ตัวอย่าง:

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

8
ฉันคิดว่านี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจากเป็นวิธี Angular2 ในการตั้งค่าระดับ html (ซึ่งฉันไม่รู้และ google นำมาให้ฉันที่นี่)
kub1x

62

นั่นเป็นโครงสร้างปกติสำหรับngClass:

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

ดังนั้นในกรณีของคุณเพียงแค่ใช้มันเช่นนี้ ...

<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

ด้วยตัวอย่างต่อไปนี้คุณสามารถใช้ 'IF ELSE'

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

1
ฉันลองวิธีที่หนึ่งและสอง เฉพาะอันที่สองทำงานให้ฉัน
user1238784

36

คุณสามารถใช้ ngClass เพื่อใช้ชื่อคลาสทั้งแบบมีเงื่อนไขและไม่อยู่ใน Angular

ตัวอย่างเช่น

[ngClass]="'someClass'">

เงื่อนไข

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

หลายเงื่อนไข

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

การแสดงออกของวิธีการ

[ngClass]="getSomeClass()"

วิธีนี้จะอยู่ในองค์ประกอบของคุณ

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

14

คุณควรใช้บางสิ่ง ( [ngClass]แทน*ngClass) เช่นนั้น:

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


10

ใน Angular 7.X

คลาส CSS ถูกอัพเดตดังนี้ขึ้นอยู่กับชนิดของการประเมินผลนิพจน์:

  • string - CSS คลาสที่แสดงรายการอยู่ในสตริง (คั่นด้วยช่องว่าง) จะถูกเพิ่ม

  • Array - คลาส CSS ที่ประกาศเป็นองค์ประกอบ Array จะถูกเพิ่ม

  • Object - keys เป็นคลาส CSS ที่เพิ่มเข้ามาเมื่อนิพจน์ที่กำหนดในค่าประเมินเป็นค่าความจริงมิฉะนั้นจะถูกลบออก

<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

เพื่อขยาย MostafaMashayekhi คำตอบของเขาสำหรับตัวเลือกที่สอง> คุณยังสามารถเชื่อมโยงตัวเลือกหลายตัวด้วย ','

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

นอกจากนี้ * ng หากสามารถใช้ในบางสถานการณ์เหล่านี้มักจะรวมกับ * ngFor

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

6

ในขณะที่ฉันกำลังสร้างฟอร์มที่มีปฏิกิริยาฉันต้องกำหนดคลาส 2 ประเภทบนปุ่ม นี่คือวิธีที่ฉันทำ:

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

เมื่อรูปแบบที่ถูกต้องปุ่มมี btn และ btn-class (จาก bootstrap) มิฉะนั้นเพียงแค่ระดับ btn


5

นอกจากนี้คุณสามารถเพิ่มด้วยฟังก์ชันเมธอด:

ในรูปแบบ HTML

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

ใน component.ts

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

    return classes;
  }

4

ให้ YourCondition เป็นเงื่อนไขของคุณหรือคุณสมบัติบูลีนจากนั้นทำเช่นนี้

[class.yourClass]="YourCondition"

4

ngClass ไวยากรณ์:

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

คุณสามารถใช้สิ่งนี้:

<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

คุณสามารถใช้ [ngClass] หรือ [class.classname] ได้ทั้งคู่จะทำงานเหมือนกัน
[class.my-class]="step==='step1'"

   หรือ

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

ทั้งสองจะทำงานเหมือนกัน!


1

ไม่เกี่ยวข้องกับ[ngClass]คำสั่ง แต่ฉันก็ได้รับข้อผิดพลาดเช่นเดียวกัน

ไม่สามารถอ่านคุณสมบัติ 'ลบ' ของที่ไม่ได้กำหนดที่ ...

และฉันคิดว่าเป็นข้อผิดพลาดใน[ngClass]สภาพของฉันแต่มันกลับกลายเป็นว่าคุณสมบัติที่ฉันพยายามเข้าถึงในสภาพที่[ngClass]ไม่ได้เริ่มต้น

เช่นฉันมีสิ่งนี้ในไฟล์ typescript ของฉัน

element: {type: string};

และในฉัน[ngClass]ฉันใช้

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

และฉันได้รับข้อผิดพลาด

ไม่สามารถอ่าน 'ประเภท' คุณสมบัติที่ไม่ได้กำหนดที่ ...

และวิธีแก้ไขคือแก้ไขคุณสมบัติของฉันให้เป็น

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

หวังว่ามันจะช่วยให้คนที่กำลังพยายามที่จะตรงกับเงื่อนไขของสถ [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>

รหัสเป็นตัวอย่างที่ดีของ ngClass หากมีเงื่อนไขอื่น

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

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

0

ลองแบบนี้ ..

กำหนดชั้นเรียนของคุณด้วย ''

<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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.