AngularJS ngClass条件付き


499

ng-class条件付きであることを表現する方法はありますか?

たとえば、私は次のことを試しました:

<span ng-class="{test: 'obj.value1 == \'someothervalue\''}">test</span>

このコードの問題obj.value1は、何であれ、クラステストが常に要素に適用されることです。これを行う:

<span ng-class="{test: obj.value2}">test</span>

obj.value2真の値に等しくない限り、クラスは適用されません。これで、最初の例でこの問題を回避できます。

<span ng-class="{test: checkValue1()}">test</span>

どこcheckValue1の関数は次のようになります。

$scope.checkValue1 = function() {
  return $scope.obj.value === 'somevalue';
}

私はこれがどのように機能するng-classことになっているのか疑問に思っています。これと同様のことをしたいカスタムディレクティブも作成しています。しかし、私は式を見る方法を見つけることができません(そして、多分それは不可能であり、それがこのように機能する理由です)。

ここに私が意味することを示すplnkrがあります。



43
ダッシュとクラスは引用符で囲む必要があります:ng-class="'label-success': obj.value1 == 'Ready', 'label-warning': obj.value1 == 'On hold'}"
ブレント・ウォッシュバーン

2
ng-classでより多くの条件を使用できます。このブログを参照してください goo.gl/qfEQZw
virender


"ダッシュのあるクラスにはまつげが必要です '' '' '' '"
リチャード

回答:


596

あなたの最初の試みはほぼ正しかった、それは引用符なしで動作するはずです。

{test: obj.value1 == 'someothervalue'}

これがplnkrです。

ngClassディレクティブは、Javascript式に少し似ていますが、真実または偽を評価する任意の式で機能しますが、いくつかの違いがありますが、ここで読むことができます。条件が複雑すぎる場合は、3回目の試行で行ったように、真または偽を返す関数を使用できます。

補足として:論理演算子を使用して、次のような論理式を作成することもできます。

ng-class="{'test': obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}"

2
おかげで、何らかの理由で、これはオブジェクトの値としての式だったので、全体を引用符で囲む必要があったと思います。
ryanzec 2013年

8
クラス'をさらに追加したい場合、またはクラスにハイフンやアンダースコアが含まれている場合は、クラス名をそれ以外の名前でラップしてください。ng-class="{'test test-2: obj.value1 === 'value'}"
Andrea Turri 2014年

6
@Andrea、最後の引用を忘れました: ng-class="{'test test-2': obj.value1 === 'value'}"
ErikE

Angular2(私が見つけようとしていた)の場合、次のような属性を使用します[class.test]="obj.value1 == 'someotervalue'"
kub1x 2016年

読者への参考までに、括弧を付けることもできます。 ng-class="{danger:!enabled || (type === 'WHEEL' && !isOnline) }
daCoda

227

ng-repeat内でng-classを使用する

<table>
    <tbody>
            <tr ng-repeat="task in todos"
                ng-class="{'warning': task.status == 'Hold' , 'success': task.status == 'Completed',
              'active': task.status == 'Started', 'danger': task.status == 'Pending' } ">
                <td>{{$index + 1}}</td>
                <td>{{task.name}}</td>
                <td>{{task.date|date:'yyyy-MM-dd'}}</td>
                <td>{{task.status}}</td>
            </tr>
    </tbody>
</table>

task.statusのステータスごとに、行に異なるクラスが使用されます。


複数のクラスがある完璧な例、ありがとう!
Sreekanth Karini、2016年

112

Angular JSは、ng-classディレクティブでこの機能を提供します。条件を設定し、条件付きクラスを割り当てることもできます。これは、2つの異なる方法で実現できます。

タイプ1

<div ng-class="{0:'one', 1:'two',2:'three'}[status]"></div>

このコードでは、クラスはステータス値の値に従って適用されます

場合は、ステータス値は0、クラスの適用1を

場合は、ステータス値は1、クラスに適用2を

場合は、ステータス値は2、クラスに適用3を


タイプ2

<div ng-class="{1:'test_yes', 0:'test_no'}[status]"></div>

ステータスの値によって適用されるクラス

場合は、ステータス値が1または真のそれは、クラスの追加されますtest_yesを

場合は、ステータス値が0またはfalse、それがクラスに追加されますtest_noを


1
ここのステータスは何ですか?
CommonSenseCode

ステータスは、適用するクラスに応じて確認または検証する値です。
Kaushal Khamar

4
このようにすると、複数の値を処理するときに柔軟性が高まり、正気が
失われ

複数のクラスで使用するのはどうですか。例:<div ng-class = "{0: 'one'、1: 'two'、2: 'three'} [status]、{0: 'one'、1: 'two'} [status1]"> </ div>
parth.hirpara

1
次のような場合にこれを使用できますか <div ng-class="{'Image' || 'image': 'image-icon', 'Video' || 'video' || 'aVideo' || 'bVideo' : 'video-icon'}[resource.type]"></div>
Chandra Kant Paliwal

80

上記のすばらしい例を見てみますが、それらはすべて中括弧(jsonマップ)で始まります。別のオプションは、計算に基づいて結果を返すことです。結果は、CSSクラス名のリストにもなります(マップだけではありません)。例:

ng-class="(status=='active') ? 'enabled' : 'disabled'"

または

ng-class="(status=='active') ? ['enabled'] : ['disabled', 'alik']"

説明:状況がアクティブの場合、クラスenabledが使用されます。それ以外の場合は、クラスdisabledが使用されます。

リスト[]は、1つだけではなく複数のクラスを使用するために使用されます。


1
素敵な、すべての素晴らしい例ですが、私はあなたが一番好きです!
stormec56 2016年

48

htmlクラス属性と省略形if / elseで使用できる簡単なメソッドがあります。それほど複雑にする必要はありません。次の方法を使用してください。

<div class="{{expression == true ? 'class_if_expression_true' : 'class_if_expression_false' }}">Your Content</div>

ハッピーコーディング、ニマンサペレラ


2
この男はそれを取得します。ありがとうバッド
deepakgates

36

ng-classを動的に適用できる2つの方法を紹介します

ステップ1

三項演算子を使用する

<div ng-class="condition?'class1':'class2'"></div>

出力

条件が真の場合、class1が要素に適用され、そうでない場合、class2が適用されます。

不利益

実行時に条件値を変更しようとすると、クラスはどういうわけか変更されません。したがって、動的クラス変更などの要件がある場合は、ステップ2に進むことをお勧めします。

ステップ2

<div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>

出力

条件がvalue1と一致する場合、class1が要素に適用され、value2と一致する場合、class2が適用されます。そして、動的クラス変更はそれでうまく動作します。

これがお役に立てば幸いです。


36

角構文は演算子を使用して、if修飾子と同等の機能を実行します

<div ng-class="{ 'clearfix' : (row % 2) == 0 }">

clearfixクラスを偶数行に追加します。それにもかかわらず、式は通常のif条件で使用できるものであれば何でも可能であり、trueまたはfalseのいずれかに評価する必要があります。


1
いいね!また、ng-repeat内では$ evenを使用してクラスを設定できます。例:ng-class = "$ even? 'even': 'odd'"。ng-repeat内のその他の気の利いたboolは$ first、$ last、$ even、$ odd ...
Max

15

ng-classで関数を使用することは、適切なCSSクラスを決定するために複雑なロジックを実行する必要がある場合に適したオプションです。

http://jsfiddle.net/ms403Ly8/2/

HTML:

<div ng-app>
  <div ng-controller="testCtrl">
        <div ng-class="getCSSClass()">Testing ng-class using function</div>       
    </div>
</div>

CSS:

.testclass { Background: lightBlue}

JavaScript

function testCtrl($scope) {
    $scope.getCSSClass = function() {
     return "testclass ";
  }     
}

2
これは懸念を混同すると思います。コントローラーはより抽象的で、CSSクラスを気にする必要はなく、状態である必要があります。状態に基づいて、CSSクラスをテンプレートに適用する必要があります。このようにして、コントローラーはテンプレートから独立し、再利用が容易になります。
Hubert Grzeskowiak 16

9

これを使って

<div ng-class="{states}[condition]"></div>

たとえば、条件が[2 == 2]の場合、状態は{true: '...'、false: '...'}です。

<div ng-class="{true: 'ClassA', false: 'ClassB'}[condition]"></div>

しかし、3つ以上の条件がある場合、これは機能しませんか?これはtrueとfalseの条件のみを返すため
Ali Al Amine

条件は真または偽を意味します。あなたは2つ以上の値を持つ何かを意味しますか?@AlyAlAmeen
Saeed

7

Angular 2の場合、これを使用してください

<div [ngClass]="{'active': dashboardComponent.selected_menu == 'mapview'}">Content</div>

:/他の条件付きそうのような配列使用している場合は、この時に展開するには、角度2のためにあなたがしても、クラスとクラス修飾子を適用する[ngClass]="['base-class', thread.isActive ? 'base-class--active' : '']"
マット・ラーベ

5

ng-classコアAngularJのディレクティブです。「文字列構文」、「配列構文」、「評価された式」、「三項演算子」、および以下で説明するその他の多くのオプションを使用できます。

文字列構文を使用したngClass

これは、ngClassを使用する最も簡単な方法です。Angular変数をng-classに追加するだけで、その要素に使用されるクラスになります。

<!-- whatever is typed into this input will be used as the class for the div below -->
<input type="text" ng-model="textType">

<!-- the class will be whatever is typed into the input box above -->
<div ng-class="textType">Look! I'm Words!

文字列構文を使用したngClassのデモ例

配列構文を使用したngClass

これは、複数のクラスを適用できることを除いて、文字列構文メソッドに似ています。

<!-- both input boxes below will be classes for the div -->
<input type="text" ng-model="styleOne">
<input type="text" ng-model="styleTwo">

<!-- this div will take on both classes from above -->
<div ng-class="[styleOne, styleTwo]">Look! I'm Words!

評価された式を使用したngClass

ngClassを使用するより高度な方法(およびおそらく最もよく使用する方法)は、式を評価することです。これが機能する方法は、変数または式がに評価されるtrue場合、特定のクラスを適用できることです。そうでない場合、クラスは適用されません。

<!-- input box to toggle a variable to true or false -->
<input type="checkbox" ng-model="awesome"> Are You Awesome?
<input type="checkbox" ng-model="giant"> Are You a Giant?

<!-- add the class 'text-success' if the variable 'awesome' is true -->
<div ng-class="{ 'text-success': awesome, 'text-large': giant }">

評価された式を使用したngClassの

値を使用するngClass

これは、複数の値を唯一の変数と比較できることを除いて、評価された式メソッドに似ています。

<div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>

三項演算子を使用したngClass

三項演算子を使用すると、2つの異なるクラスを指定するために省略表現を使用できます。1つは式が真の場合、もう1つは偽の場合です。三項演算子の基本的な構文は次のとおりです。

ng-class="$variableToEvaluate ? 'class-if-true' : 'class-if-false'">

最初、最後、または特定の数の評価

ngRepeatディレクティブを使用していてfirst、クラスを、、lastまたはリスト内の特定の番号に適用する場合は、の特別なプロパティを使用できますngRepeat。これらには$first$last$even$odd、およびいくつかの他。これらの使用例を以下に示します。

<!-- add a class to the first item -->
<ul>
  <li ng-class="{ 'text-success': $first }" ng-repeat="item in items">{{ item.name }}</li>
</ul>

<!-- add a class to the last item -->
<ul>
  <li ng-class="{ 'text-danger': $last }" ng-repeat="item in items">{{ item.name }}</li>
</ul>

<!-- add a class to the even items and a different class to the odd items -->
<ul>
  <li ng-class="{ 'text-info': $even, 'text-danger': $odd }" ng-repeat="item in items">{{ item.name }}</li>
</ul>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.