AngularJS 模板中的三元运算符

IT技术 javascript html angularjs ternary-operator
2021-01-25 12:08:18

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

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

6个回答

更新: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>
如果可以,我会再次为您投票以更新问题!
2021-03-14 12:08:18
警告,1.1.5 目前不稳定。
2021-03-15 12:08:18
在对象键访问示例中,您可以跳过 'false' 键,因为它无论如何都是空字符串。
2021-03-17 12:08:18
如果模型更新时条件发生变化怎么办?我想要ng-style更新,但它似乎只在第一次呈现元素时进行评估。(角度菜鸟在这里)
2021-03-19 12:08:18
我会处理的,@Narrez。
2021-03-31 12:08:18

更新: 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>
@blesh,AngularJS 提高了可测试性。模板不应包含任何逻辑。模板中的三元运算符应重构为对控制器的函数调用,以获得更好的可测试性。
2021-03-15 12:08:18
三元从未实现,但这只是使用二元运算符的工作方式。
2021-03-21 12:08:18
奇怪的。这不是很直观。我想知道为什么它是这样实现的。
2021-03-30 12:08:18
@arg20 您应该使用ngClass指令(或 ngClassEven 和 ngClassOdd)。然后把所有选择css类的逻辑放在控制器中。这更容易自动测试。
2021-04-01 12:08:18
@arg20 我说过要把它放在控制器里,而不是放在模型里。这应该不是问题。但是,文档说:“评估的结果可以是表示空格分隔的类名、数组或类名到布尔值的映射的字符串”。这意味着您可以使用 "{ cssclass: someBoolCheck() }" 作为表达式,即您将 css 类放在视图中,并将逻辑放在控制器中。这个 jsFiddle为例。
2021-04-02 12:08:18

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

<span>
  {{userType=='admin' ? 'Edit' : 'Show'}}
</span>

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

此答案早于版本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>
我为三元运算符提出了这个问题,但最后我使用了过滤器,感觉非常好...... =D
2021-04-02 12:08:18