Angular:带* ngClass的条件类


562

我的Angular代码有什么问题?我正进入(状态:

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>

Answers:


1221

Angular版本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"因此在这个意义上是相同的
YakovL

1
谢谢男人..你太棒了
Pranav 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而不是规范的形式。
君特Zöchbauer

75

另一个解决方案是使用[class.active]

范例:

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

8
我认为这应该是一个可以接受的答案,因为这是设置html类的Angular2方法(我不知道,而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 '18

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


10

Angular 7.X

CSS类的更新如下,具体取决于表达式求值的类型:

  • string-添加字符串中列出的CSS类(以空格分隔)

  • Array-添加了声明为Array元素的CSS类

  • 对象-键是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>

6

在创建反应形式时,我必须在按钮上分配两种类型的类。这是我的方法:

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

当表单有效时,按钮具有btn和btn-class(来自引导程序),否则只有btn类。


6

扩展MostafaMashayekhi他对选项2的回答>,您也可以将多个选项链接为','

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

* ngIf也可以在某些情况下通常与* ngFor结合使用

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

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

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>



1

[ngClass]指令无关,但我也收到与相同的错误

无法读取未定义的属性“删除” ...

并且我以为是我的[ngClass]情况下的错误,但结果是我在[ngClass]未初始化的情况下尝试访问的属性。

就像我的打字稿文件中有这个一样

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.