AngularJs 使用布尔运算符的一次性绑定和值顺序

AngularJs one time binding and order of values with boolean operators

布尔运算符的声明顺序有什么影响?

控制器:

$scope.show = false;

$scope.clickMe = function() {
  $scope.show = true;
  $scope.name = 'Name defined'
};

模板:

<button ng-click="clickMe($event)">Click Me</button>
<p ng-if="::(show && name)">show && name</p>
<p ng-if="::(name && show)">name && show</p>

在单击按钮后显示顺序为 name && show 的第二个 p 元素。我知道 p 元素都不应该显示,因为 $scope.show 已经定义并且已经使用了一次绑定?

plunkr 在这里:

http://plnkr.co/edit/P0E1RhNK9EPh2Pi04c9T?p=preview

在 Angular 中,一次性绑定将不断地计算表达式,直到它具有非 undefined 值。所以在你的例子中,因为 name 还没有定义 name && show 在每个摘要上不断地评估为 undefined 直到你最终设置它。如果您使用 !! 将名称强制转换为布尔值,那么您会得到不同的行为。来自 Angular docs on expressions:

One-time expressions will stop recalculating once they are stable, which happens after the first digest if the expression result is a non-undefined value (see value stabilization algorithm below).

所以它本身不会计算一次,它计算一个值一次。