为什么我的Angular.js控制器在下面的代码中执行了两次它的函数?
Why does my Angular.js controller executes its function twice in the following code?
我有一个ng-repeat
在一个属于SomeController
的对象数组中循环:
<div ng-controller="SomeController as aCtrl">
<div ng-repeat="category in aCtrl.categories">
<p ng-show="aCtrl.checkShouldBeDisplayed(category)">{{category.name}}</p>
</div>
</div>
控制器定义为:
app.controller('SomeController', function() {
this.categories = [{
"name": "one",
}, {
"name": "two",
}, {
"name": "three",
}, {
"name": "four",
}];
this.counter = 0;
this.checkShouldBeDisplayed = function(channel) {
this.counter = this.counter + 1;
console.log("executing checkShouldBeDisplayed " + this.counter);
return true;
};
});
我希望checkShouldBeDisplayed
函数计数为4,因为SomeController.categories
数组中有四个元素。相反,它计数为8 -在这里检查:http://plnkr.co/edit/dyvM49kLLTGof9O92jGb(您需要查看浏览器中的控制台以查看日志)。我怎样才能避免这种行为呢?干杯!
这是预期的;指令ng-repeat
将重复多少次,框架认为是正确的;这被称为脏检查,你可以在这篇文章中读到更多关于它的内容。
checkShouldBeDisplayed
应该只做它在罐头上说的,而不依赖于它被调用的次数。如果您需要执行某种类型的聚合或操作,则应该在控制器的其他地方完成。
根据的文档:
watchExpression在每次调用$digest()时被调用,并且应该返回将被监视的值。(由于$digest()在检测到变化时会重新运行,因此watchExpression可以对$digest()执行多次,并且应该是幂等的。)
[…]
手表侦听器可能会更改型号,这可能会触发其他侦听器。这是通过重新运行监视程序,直到没有检测到任何更改来实现的。
所有ngShow
所做的就是注册一个观察者:
scope.$watch(attr.ngShow, function ngShowWatchAction(value){
$animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');
});
您的函数是ngShow
的watch-expression,因此执行两次:
1. 在第一个$digest中,它检测新值。
2. 在第二个$digest中,它验证没有任何更改并终止。
在这个简短演示中,您可以验证有两个$digest循环。
相关文章:
- Meteor Router数据函数被调用两次
- Append元素在运行两次函数后不显示
- 为什么我们要在语句中两次将函数括在括号中
- 调用一个函数两次
- java-script 函数被调用两次
- Ajax Post-Submit函数提交两次
- 在一个页面中包含两次的脚本中调用函数
- 我必须点击两次才能使用jQuery激活函数
- 为什么这个函数执行了两次
- isHidden函数要求我在应用响应显示时单击两次
- 调用随机函数Javascript,但不能两次调用相同的函数
- jQuery停止函数运行两次
- JS函数只需点击一次即可触发两次
- 在一个页面中使用相同的javascript函数两次
- matchMedia调用函数两次
- JS函数中的一个点击按钮被调用了两次
- jQuery移除两次函数调用
- 在JS中定义两次函数.根据网页指示要使用的定义
- 防止在两个触发事件中执行两次函数
- AngularJS需要执行两次函数才能显示结果