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 在这里:
在 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).
所以它本身不会计算一次,它计算一个值一次。
布尔运算符的声明顺序有什么影响?
控制器:
$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 在这里:
在 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).
所以它本身不会计算一次,它计算一个值一次。