ChatGPT解决这个技术问题 Extra ChatGPT

Angular:带有 *ngClass 的条件类

我的 Angular 代码有什么问题?我收到以下错误:

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

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

V
Vega

Angular 2+ 版提供了几种有条件地添加类的方法:

第一类

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

完美的答案,只需将类型 2 修复为: [ngClass]="{'my-class': step=='step1'}" 使用 '' int 类名
我一直在寻找类型四,但我想知道是否可以在该表达式中添加另一个具有另一个条件的类?提前致谢
对于类型三,类名和检查的顺序是错误的。它应该是类名,例如 [ngClass]="{ 'my-class1': 1, 'my-class2': 2 }"
看起来“类型三”和“类型四”是 [ngClass]="js expression returning html class string" 的特定用法,因此在这个意义上是相同的
任何人都可以将我链接到类型一的文档吗?我在 Angular 网站上找不到
G
Günter Zöchbauer

[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

... ... ... ... ...

另请参阅https://angular.io/docs/ts/latest/guide/template-syntax.html

类绑定是特殊的
这个没那么特别

Bad curly


从角度文档中:“星号是更复杂的东西的“语法糖”。在内部,Angular 将 *ngIf 属性转换为 <ng-template> 元素,包裹在宿主元素周围,就像这样。*ngIf指令移动到 <ng-template> 元素,在那里它成为一个属性绑定,[ngIf]。<div> 的其余部分,包括它的类属性,移动到 <ng-template> 元素内。” - 更多信息@angular.io/guide/structural-directives#the-asterisk--prefix
实际上,它并不复杂,* 只是允许简化语法而不是规范形式。
J
Joel Almeida

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

例子 :

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

S
Sunil Garg

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>

C
Chaitanya Nekkalapudi

通过以下示例,您可以使用“IF ELSE”

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

我尝试了第一个和第二个解决方案。只有第二个对我有用
j
jmcgrath207

您可以使用 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};
    }

你好,对不起,我对角度有点陌生。使用 [ngClass]="getSomeClass()" 被认为是一种好习惯吗?从我在日志中可以看到 - 它每隔几毫秒就会被评估一次。提前致谢
@Jack 这取决于,如果你想执行一些额外的业务逻辑来应用类,方法会更有意义。在 html 上编写这些逻辑很乏味。
M
Mironline

Angular 提供了多种有条件地添加类的方法:

第一种方式

active 是你的班级名称

[class.active]="step === 'step1'"

第二种方式

active 是你的班级名称

[ngClass]="{'active': step=='step1'}"

第三种方式

通过使用三元运算符 class1 和 class2 是您的类名

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

与接受的答案相比,有什么新的?
T
Thierry Templier

您应该使用类似的东西([ngClass] 而不是 *ngClass):

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


s
span

Angular 7.X

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

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

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

Object - 键是 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>

A
Alper BULUT

此外,您可以添加 with 方法功能:

在 HTML 中

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

在组件.ts

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

    return classes;
  }

R
Robert Leeuwerink

扩展 MostafaMashayekhi 他对选项二的回答>您还可以使用“,”链接多个选项

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

*ngIf 也可以用于其中一些情况,通常与 *ngFor 结合使用

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

W
Waleed Shahzaib

您可以使用 [ngClass] 或 [class.classname],两者的工作方式相同。
[class.my-class]="step==='step1'"

  或者

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

两者的工作方式相同!


S
Sarvar N

在创建响应式表单时,我必须在按钮上分配 2 种类型的类。我是这样做的:

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

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


A
Abdus Salam Azad

让,YourCondition 是你的条件或布尔属性,然后这样做

[class.yourClass]="YourCondition"

f
fcdt

我们可以使用以下语法使类动态化。在 Angular 2 plus 中,您可以通过多种方式执行此操作:

[ngClass]="{'active': arrayData.length && arrayData[0]?.booleanProperty}"
[ngClass]="{'active': step}"
[ngClass]="step== 'step1'?'active':''"
[ngClass]="step? 'active' : ''"

C
Chirag

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>

P
Prashant Pimpale

这对我有用:

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

T
Tharindu Lakshan

该指令以三种不同的方式运行,具体取决于表达式计算为三种类型中的哪一种:

如果表达式的计算结果为字符串,则该字符串应该是一个或多个以空格分隔的类名。如果表达式的计算结果是一个对象,那么对于具有真值的对象的每个键值对,对应的键被用作类名。如果表达式的计算结果为数组,则数组的每个元素都应该是类型 1 中的字符串或类型 2 中的对象。这意味着您可以将字符串和对象混合在一个数组中,以便更好地控制出现 CSS 类。有关此示例,请参见下面的代码。

    [class.class_one] = "step === 'step1'"

    [ngClass]="{'class_one': step === 'step1'}"

对于多个选项:

    [ngClass]="{'class_one': step === 'step1', 'class_two' : step === 'step2' }" 

    [ngClass]="{1 : 'class_one', 2 : 'class_two', 3 : 'class_three'}[step]"

    [ngClass]="step == 'step1' ? 'class_one' : 'class_two'"

H
Hamza Khanzada

[ngClass] 指令无关,但我也遇到了同样的错误

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

我认为是我的 [ngClass] 条件下的错误,但结果是我试图在 [ngClass] 条件下访问的属性没有初始化。

就像我在打字稿文件中有这个

element: {type: string};

在我的 [ngClass] 中,我正在使用

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

我得到了错误

无法在...读取未定义的属性“类型”

解决方案是将我的财产修复为

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

希望它对尝试匹配 [ngClass] 中的属性条件的人有所帮助


a
amarbhanu

代码是 ngClass if else 条件的好例子。

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

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

A
Aishwarya Kathavarayan

试试这样..

用''定义你的班级

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

H
Halil İbrahim Oymacı

对于 elseif 语句(较少比较)使用如下:(例如你比较三个语句)

<div [ngClass]="step === 'step1' ? 'class1' : (step === 'step2' ? 'class2' : 'class3')"> {{step}} </div>

P
Priyanka Ahire

如果用户想根据 && 和 || 显示类然后下面一个对我有用

[ngClass]="{'clasname_1':  condition_1 && condition_2, 'classname_2':  condition_1 && condition2, 'classname_3': condition}"

例子:

[ngClass]="{'approval-panel-mat-drawer-side-left':  similar_toil_mode==='side' && showsTheSimilarToilsWithCloseIcon, 'approval-panel-mat-drawer-side-right':  similar_toil_mode==='side' && !showsTheSimilarToilsWithCloseIcon, 'approval-panel-mat-drawer-over': similar_toil_mode==='over'}"