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>

回答:


1229

Angularバージョン2、...、9は、条件付きでクラスを追加するいくつかの方法を提供します。

タイプ1

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

タイプ2

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

および複数のオプション:

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

タイプ3

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

タイプ4

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

7
完璧な答えです。タイプ2を次のように修正してください:[ngClass] = "{'my-class':step == 'step1'}" '' int the class name
Adriano Galesso Alves

2
タイプ3の場合、クラス名とチェックの順序が間違っています。最初は[ngClass] = "{'my-class1':1、 'my-class2':2}"などのクラス名である必要があります
obaylis

1
"タイプ3"と "タイプ4"の具体的な使用法の[ngClass]="js expression returning html class string"ように見えるので、この意味では同じです
YakovL

1
ありがとうございます。あなたは素晴らしいです
プラナブMS

1
完璧な答えの仲間。本当にありがとう !
Anjana Silva

423

[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>の残りの部分は、<ng-template>要素内に移動しました。-詳細@ angular.io/guide/structural-directives#the-asterisk--prefix
結合

実際、これ*はそれほど複雑なことではなく、正規形ではなく単純化された共軸を許可するだけです。
ギュンターZöchbauer

75

別の解決策は、を使用すること[class.active]です。

例:

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

8
これは、Angular2がHTMLクラスを設定する方法であるため、これが受け入れられる答えになるはずだと思います(私は知らなかったため、Googleがここに連れてきました)。
kub1x 2016年

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
最初と2番目の解決策を試しました。2番目だけが私のために働いた
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クラス(スペース区切り)が追加されます

  • 配列-配列要素として宣言された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>

7

MostafaMashayekhiのオプション2に対する彼の答えを拡張するには、「、」で複数のオプションをチェーンすることもできます。

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

また、* ngIfは、これらの状況の一部で通常は* 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(ブートストラップから)があり、それ以外の場合は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

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]ディレクティブとは関係ありませんが、同じエラーが発生しました

未定義のプロパティ 'remove'を読み取れません...

そして、私は自分の[ngClass]状態のエラーであると考えましたが、それが私がアクセスしようとしたプロパティ[ngClass]が初期化されていない状態であることがわかりました。

私のtypescriptファイルにこれがあったように

element: {type: string};

と私の[ngClass]中で使用していた

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

エラーが発生しました

未定義のプロパティ 'type'を読み取れません...

解決策は私の財産を

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.