239

你如何用 AngularJS(在模板中)做一个三元组?

在 html 中使用一些属性(类和样式)而不是创建和调用控制器的函数会很好。

4

8 回答 8

374

更新:Angular 1.1.5 添加了一个三元运算符,所以现在我们可以简单地编写

<li ng-class="$first ? 'firstRow' : 'nonFirstRow'">

如果您使用的是早期版本的 Angular,您的两个选择是:

  1. (condition && result_if_true || !condition && result_if_false)
  2. {true: 'result_if_true', false: 'result_if_false'}[condition]

上面的第 2 项创建了一个具有两个属性的对象。数组语法用于选择名称为 true 的属性或名称为 false 的属性,并返回关联的值。

例如,

<li class="{{{true: 'myClass1 myClass2', false: ''}[$first]}}">...</li>
 or
<li ng-class="{true: 'myClass1 myClass2', false: ''}[$first]">...</li>

$first 在第一个元素的 ng-repeat 中设置为 true,因此上面将仅在第一次通过循环时应用类“myClass1”和“myClass2”。

但是使用ng-class有一种更简单的方法:ng-class 接受一个表达式,该表达式必须计算为以下之一:

  1. 一串以空格分隔的类名
  2. 类名数组
  3. 类名到布尔值的映射/对象。

上面给出了 1) 的示例。这是 3 的示例,我认为它读起来更好:

 <li ng-class="{myClass: $first, anotherClass: $index == 2}">...</li>

第一次通过 ng-repeat 循环,添加了 myClass 类。第三次通过($index 从 0 开始),添加类 anotherClass。

ng-style接受一个表达式,该表达式必须计算为 CSS 样式名称到 CSS 值的映射/对象。例如,

 <li ng-style="{true: {color: 'red'}, false: {}}[$first]">...</li>
于 2012-08-28T00:59:06.847 回答
86

更新: Angular 1.1.5 添加了一个三元运算符,这个答案只对 1.1.5 之前的版本是正确的。对于 1.1.5 及更高版本,请参阅当前接受的答案。

在 Angular 1.1.5 之前:

angularjs中三元的形式为:

((condition) && (answer if true) || (answer if false))

一个例子是:

<ul class="nav">
    <li>
        <a   href="#/page1" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Goals</a>
    </li>
    <li>
        <a   href="#/page2" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Groups</a>
    </li>
</ul>

或者:

 <li  ng-disabled="currentPage == 0" ng-click="currentPage=0"  class="{{(currentPage == 0) && 'disabled' || ''}}"><a> << </a></li>
于 2012-08-17T15:20:25.133 回答
22

对于角模板中的文本(userType是 $scope 的属性,如 $scope.userType):

<span>
  {{userType=='admin' ? 'Edit' : 'Show'}}
</span>
于 2015-10-14T11:46:49.883 回答
10

这个答案早于1.1.5$parse版本,其中函数中没有适当的三元组。如果您使用的是较低版本,或者作为过滤器的示例,请使用此答案:

angular.module('myApp.filters', [])
  
  .filter('conditional', function() {
    return function(condition, ifTrue, ifFalse) {
      return condition ? ifTrue : ifFalse;
    };
  });

然后将其用作

<i ng-class="checked | conditional:'icon-check':'icon-check-empty'"></i>
于 2013-01-16T12:21:59.430 回答
10

虽然您可以condition && if-true-part || if-false-part在旧版本的 Angular 中使用 - 语法,但通常的三元运算符condition ? true-part : false-partAngular 1.1.5 及更高版本中可用。

于 2013-05-19T09:20:11.290 回答
9

就是这样:三元运算符在1.1.5中被添加到角度解析器中!查看更新日志

这是一个小提琴,显示了 ng-class 指令中使用的新三元运算符。

ng-class="boolForTernary ? 'blue' : 'red'"
于 2013-05-23T08:19:34.833 回答
0
  <body ng-app="app">
  <button type="button" ng-click="showme==true ? !showme :showme;message='Cancel Quiz'"  class="btn btn-default">{{showme==true ? 'Cancel Quiz': 'Take a Quiz'}}</button>
    <div ng-show="showme" class="panel panel-primary col-sm-4" style="margin-left:250px;">
      <div class="panel-heading">Take Quiz</div>
      <div class="form-group col-sm-8 form-inline" style="margin-top: 30px;margin-bottom: 30px;">

        <button type="button" class="btn btn-default">Start Quiz</button>
      </div>
    </div>
  </body>

按钮切换和更改按钮的标题和显示/隐藏 div 面板。见Plunkr

于 2016-04-02T16:43:07.993 回答
0

如果有人仍在处理像我这样的遗留代码,你也可以使用 ng-style 中的三元运算符来实现这一点,如下所示:

<li ng-style="{'color': connected ? '#008000' : '#808080'}"></li>
于 2022-02-18T19:48:19.210 回答