AngularJS ngClass有条件

时间:2013-05-13 19:38:38

标签: html css angularjs

有没有办法让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

11 个答案:

答案 0 :(得分:561)

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

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

这是plnkr

ngClass指令适用于任何评估truthy或falsey的表达式,有点类似于Javascript表达式但有一些差异,你可以阅读here。 如果你的条件太复杂,那么你可以使用一个返回真或假的函数,就像你在第三次尝试时那样。

补充:你也可以使用逻辑运算符来形成像

这样的逻辑表达式
ng-class="{'test': obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}"

答案 1 :(得分:215)

在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中的每个状态,该行使用不同的类。

答案 2 :(得分:102)

Angular JS ng-class Directive 中提供此功能。您可以在其中放置条件并分配条件类。您可以通过两种不同的方式实现这一目标。

类型1

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

此代码类将根据状态

的值应用

如果状态值为 0 ,则应用课程一个

如果状态值为 1 ,则应用课程两个

如果状态值为 2 ,则应用课程

类型2

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

将按状态

的值应用哪个班级

如果状态值为 1或为真,则会添加类 test_yes

如果状态值为 0或错误,则会添加类 test_no

答案 3 :(得分:64)

我在上面看到很好的例子,但它们都以大括号(json map)开头。另一种选择是根据计算返回结果。结果也可以是css类名列表(不仅仅是map)。例如:

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

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

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

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

答案 4 :(得分:43)

有一个简单的方法,您可以使用html类属性和速记if / else。不需要让它如此复杂。只需使用以下方法。

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

快乐编码, Nimantha Perera

答案 5 :(得分:35)

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

的方法

步骤-1

使用三元运算符

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

输出

如果您的条件为真,那么class1将应用于您的元素,否则将应用class2。

缺点

当您尝试在运行时更改条件值时,该类将以某种方式不会更改。因此,如果您有动态类更改的要求,我建议您转到第2步。

步骤-2

{{1}}

输出

如果您的条件与value1匹配,则class1将应用于您的元素,如果与value2匹配则将应用class2,依此类推。动态类更改可以正常使用。

希望这会对你有所帮助。

答案 6 :(得分:34)

Angular语法是使用运算符来执行等效的 if 修饰符

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

将clearfix类添加到偶数行。尽管如此,表达式可能是我们在正常条件下可以拥有的任何东西,它应该评估为真或假。

答案 7 :(得分:14)

当有人必须运行复杂的逻辑来决定适当的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 ";
  }     
}

答案 8 :(得分:8)

使用此

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

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

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

答案 9 :(得分:6)

对于Angular 2,请使用此

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

答案 10 :(得分:0)

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 Using String Syntax的演示示例

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 Using Evaluated Expression

的示例

ngClass使用值

这类似于评估的表达式方法,只是您只能够将多个值与唯一的变量进行比较。

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

使用三元运算符的ngClass

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

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

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

如果您使用ngRepeat指令,并且想将类应用于firstlast或列表中的特定数字,则可以使用{{ 1}}。其中包括ngRepeat$first$last$even等。这是如何使用它们的示例。

$odd