ng-classを使用したAngularJSトグルクラス


217

を使用して要素のクラスを切り替えようとしています ng-class

<button class="btn">
  <i ng-class="{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}"></i>
</button>

isAutoScroll():

$scope.isAutoScroll = function()
{
    $scope.autoScroll = ($scope.autoScroll) ? false : true;
    return $scope.autoScroll;
}

基本的に、$scope.autoScrolltrueの場合はng-classにicon-autoscroll、falseの場合はicon-autoscroll-disabled

私が今持っているものが機能せず、コンソールでこのエラーが発生しています

Error: Lexer Error: Unexpected next character at columns 18-18 [?] in expression [{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}].

これを正しく行うにはどうすればよいですか?

編集

解決策1:(古い)

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>
</button>

編集2

ソリューション2:

Solution 3Stewieから提供されたを使用する必要があるため、ソリューションを更新したかった。三項演算子に関しては(そして私にとっては最も読みやすく)、これが最も標準的です。解決策は

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>
</button>

に変換します:

if (autoScroll == true) ?//クラスを使用'icon-autoscroll' ://その他の使用'icon-autoscroll-disabled'


angular expressionsドキュメントごとに条件を使用することはできませ => 制御フローステートメントなし:角度式では、条件、ループ、スローのいずれも実行できません。別の関数またはディレクティブを使用する
charlietfl

@ロニー私はあなたの解決策を見ました、そしてそれはとてもクールでした。しかし、なぜautoScrollここで各ボタンに効果があるのでしょうか?(私はこれを複数のボタンでテストしましたが、うまくいきます)つまり、各ボタンをクリックすると、すべてのボタンではなく、そのボタンだけに影響します。
zx1986

回答:


436

ng-classで条件付きを使用する方法:

解決策1:

<i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>

解決策2:

<i ng-class="{true: 'icon-autoscroll', false: 'icon-autoscroll-disabled'}[autoScroll]"></i>

解決策3(angular v.1.1.4 +が三項演算子のサポートを導入):

<i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>

プランカー


3
2番目の例はすっきりしていますが、評価する変数を式の先頭に置くことができないのはばかげています。式をifステートメントとして見ていると想像してください: "if(variable)true:do this、false:do that ... ugh #fullynerdy
mattdlockyer

10
@Stewie Faaakinゴージャスなメイト、それが実際のコードのように見えるのが大好きで、粗雑な表現のマークアップではない:D
mattdlockyer 14年

実際に最初に値を評価することは、変数に新しい値を誤って割り当てないようにするため、非常に役立ちます。
lharby 2015年

Ternaryはまさに私が探していたものです。バージョンサポートの詳細を含む3つの例を提供しました。
TaeKwonJ​​oe 2017

13

代替ソリューションとして、最後の評価を返すJavaScript論理演算子 '&&'に基づいて、次のようにすることもできます。

<i ng-class="autoScroll && 'icon-autoscroll' || !autoScroll && 'icon-autoscroll-disabled'"></i>

構文は少しだけ短いですが、私にとっては読みやすくなっています。


10

条件に基づいて複数のクラスを追加します。

<div ng-click="AbrirPopUp(s)" 
ng-class="{'class1 class2 class3':!isNew, 
           'class1 class4': isNew}">{{ isNew }}</div>

適用:クラス1クラス2 + + Class3のときisNewが偽=

適用:isNew = trueのときのclass1 + class4


6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

jQueryのtoggleClassメソッドと同様に、これはactive要素がクリックされたときにクラスのオン/オフを切り替える方法です。


2
回答の詳細を英語で教えてもらえますか?すでにここにある答えとどう違うのですか?
Onots、2015

2
なぜこの回答に多くの反対票があるのか​​わかりませんか?これは...実際には上記の他よりも私のために良く働いたソリューションです
サンパウロGriiettner

2
説明が下手に書かれていて、人々が「jQuery」という言葉に反応するのではないかと思います。ところで、変数を初期化する必要がありますか?
Adrianによるデザイン

1

自動スクロールは、コントローラーで定義および変更されます。

<span ng-class= "autoscroll?'class_if_true':'class_if_false'"></span>

条件に基づいて複数のクラスを追加するには:

<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>


-1

私はこの方法でこの作品を作りました:

<button class="btn" ng-click='toggleClass($event)'>button one</button>
<button class="btn" ng-click='toggleClass($event)' >button two</button>

//コントローラ内

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }

2
これは機能しますが、angularとjQueryが混在しています。できればそれを避けてください。最初に要求された内容は、クリックイベントなしで実行できます。上のボタンでこのクラスを切り替えることになっている別のボタンがある場合はどうなりますか?ng-classではなくクリックで変更しているため、今は更新されません
Ronnie

1
それはjqLit​​eからです。その他のdocs.angularjs.org/api/ng/function/angular.element
Ruhul Amin

1
わかります。私の要点は、元の質問への回答を得るためにjQueryを使用する必要がないことです。
ロニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.