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'}"
Brent Washburne 2014年

2
我们可以对ng-class使用更多条件,请参见此博客 goo.gl/qfEQZw
virender 2015年


“带有破折号的班级需要睫毛'''''''“
理查德

Answers:


596

您的第一次尝试几乎是正确的,它应该没有引号。

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

这是一个plnkr

ngClass指令可与任何评估为真或假的表达式一起使用,这有点类似于Javascript表达式,但有一些区别,您可以在这里阅读。如果条件太复杂,则可以像第三次尝试一样使用返回true或false的函数。

只是为了补充:您还可以使用逻辑运算符来形成逻辑表达式,例如

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

2
谢谢,无论出于什么原因,我尽管那是因为这是一个表示对象值的表达式,所以整个内容必须用引号引起来。
ryanzec

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

仅供读者参考,您也可以使用方括号。 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

112

Angular JSng-class Directive中提供了此功能。您可以在其中放置条件,也可以分配条件类。您可以通过两种不同的方法来实现。

类型1

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

在此代码类中,将根据状态值应用值

如果状态值为0然后应用类一个

如果状态值为1然后应用类2

如果状态值为2,则应用三级


2型

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

根据状态值将应用于哪个类别

如果状态值为1或true,则将添加类test_yes

如果状态值为0或false,则将添加类test_no


1
这里的状态如何?
CommonSenseCode

状态是您要根据要应用的类检查或验证的值。
Kaushal Khamar

4
喜欢这种方式,因为它在处理多种价值时更灵活,更省心
Eduardo La Hoz Miranda

如何将其用于多个类。就像<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>

80

我在上面看到了很棒的示例,但是它们都以大括号(json映射)开头。另一种选择是基于计算返回结果。结果还可以是CSS类名称的列表(不仅仅是map)。例:

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

要么

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

说明:如果状态为活动,enabled则将使用该类。否则,disabled将使用该类。

该列表[]用于使用多个类(而不仅仅是一个类)。


1
可爱,所有令人惊奇的例子,但我最喜欢你!
stormec56

48

有一个简单的方法可以与html类属性和简写if / else一起使用。无需使其变得如此复杂。只需使用以下方法。

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

Nimantha Perera的《快乐编码》


2
这个家伙明白了。谢谢芽
Deepakgates 16/09/25

36

我将向您展示两种可以动态应用ng-class的方法

步骤1

通过使用三元运算符

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

输出量

如果您的条件为true,则将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类添加到偶数行。尽管如此,如果条件满足,表达式可以是我们在正常情况下可以拥有的任何东西,并且表达式的值应该为true或false。


1
真好!另外,在ng-repeat内部,您可以使用$ even设置类。例如ng-class =“ $ even?'even':'odd'”。ng-repeat中的其他漂亮消息是$ first,$ last,$ even,$ odd ...
Max

15

当有人必须运行复杂的逻辑来确定适当的CSS类时,将功能与ng-class结合使用是一个不错的选择。

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

9

用这个

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

例如,如果条件为[2 == 2],则状态为{true:'...',false:'...'}

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

但是如果我有3个或更多条件,这行不通吗?因为这只会返回正确和错误的条件
Ali Al Amine18年

条件是对还是错。您的意思是大于2的值吗?@AlyAlAmeen
赛义德

7

对于Angular 2,请使用此

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

为了对此进行扩展,对于Angular 2,您可以使用以下数组在if / else条件中应用一个类以及一个类修饰符:[ngClass]="['base-class', thread.isActive ? 'base-class--active' : '']"
Matt Rabe

5

ng-class是核心AngularJs的指令。您可以在其中使用“字符串语法”,“数组语法”,“求值表达式”,“三元运算符”以及以下描述的更多选项:

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使用三元运算符

三元运算符允许我们使用简写形式来指定两个不同的类,如果一个表达式为true,则为一个,否则为false。这是三元运算符的基本语法:

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

评估第一个,最后一个或特定数字

如果您使用的ngRepeat指令,并要类适用于firstlast或特定列表中的号码,你可以使用的特殊性能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>
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.