使用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.autoScroll为true,我希望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 3,因为Stewie提供的应该是使用的一种。对于三元运算符,这是最标准的(对我而言,最容易阅读)。解决方案是

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

转换为:

if (autoScroll == true) ?// use类'icon-autoscroll' ://否则使用'icon-autoscroll-disabled'


不能在angular expressions每个文档中使用条件语句 => 无控制流语句:您不能在角度表达式中执行以下任何操作:条件语句,循环语句或throw。使用其他函数或指令
charlietfl 2013年

@Ronnie我看到了您的解决方案,这真是太酷了。但是我不知道为什么autoScroll这里会在每个按钮上生效?(我使用多个按钮进行了测试,并且效果也不错)我的意思是,当我单击每个按钮时,它只会影响该按钮,而不是所有按钮。
zx1986

Answers:


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(角度v.1.1.4 +引入了对三元运算符的支持):

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

柱塞


3
第二个例子是更干净的,但是可笑的是您不能将要评估的变量放在表达式的前面……它看起来很有趣。想象一下将表达式视为if语句:“ if(variable)true:做到这一点,false:做到这一点……ugh #fullynerdy
mattdlockyer 2014年

10
@Stewie Faaakin华丽的伴侣,喜欢它看起来像真实的代码,而不是一些
混混的

实际上首先评估值非常有用,因为它可以避免意外地为变量分配新值。
lharby 2015年

三元正是我想要的。很好地提供了三个示例,其中包含版本支持详细信息。
TaeKwonJ​​oe'2

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>

当isNew = false时,应用:class1 + class2 + class3 。

应用: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
我不确定为什么这个答案有很多否定票??这实际上对我来说比上面的其他方法更有效……
Paulo Griiettner,2016年

2
我认为描述写得不好,人们对“ jQuery”一词做出了反应。描述的意思是“这类似于JQuery中的toggleClass函数”。顺便说一句,您需要初始化变量吗?
由Adrian设计,2013年

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即可获得原始问题的答案。
罗尼
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.