请看一下这段代码:(on plunker)
angular
.module('intervalExample', [])
.controller('ExampleController', ['$scope', '$interval', function($scope, $interval) {
$interval(function() {
//nothing..
}, 1000);
$scope.do = function() {
console.log(new Date());
return true;
}
}]);
<body ng-app="intervalExample">
<div>
<div ng-controller="ExampleController">
<div ng-if="do()">text</div>
</div>
</div>
</body>
如果您打开控制台,您会看到每秒都会调用$scope.do
。这是为什么?为什么$interval
导致指令重新加载?有没有办法避免它?
它也适用于其他指令(例如ngShow)..
答案 0 :(得分:3)
这是Angular如何运作的全部观点。每次处理程序通过$interval
注册时,Angular都会执行摘要循环,这意味着它会检查每个监视表达式以查看是否有任何更改。如果检测到更改,Angular将修改DOM以反映更改。因为do()
由ng-if
注册的监视表达式调用,所以每次计时器触发时也会调用它。
如果您不想这样做,请不要使用$interval
;只需使用正常的setInterval
调用,但请注意,您在回调中修改的任何数据都不会导致Angular模板更新。不建议采用这种方法。相反,如果每秒调用do()
的问题是do()
过于昂贵,请找一种方法使其更便宜,例如通过缓存结果。
答案 1 :(得分:1)
是的,我认为这是因为$interval
会导致摘要传递,并且每次发生这种情况时都会对ng-if进行测试,因此每次都会对$ scope.do()进行评估。
我认为传递一个好主意并不是一个好主意。