$ interval刷新指令

时间:2015-07-15 17:03:36

标签: angularjs angularjs-directive

请看一下这段代码:(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)..

2 个答案:

答案 0 :(得分:3)

这是Angular如何运作的全部观点。每次处理程序通过$interval注册时,Angular都会执行摘要循环,这意味着它会检查每个监视表达式以查看是否有任何更改。如果检测到更改,Angular将修改DOM以反映更改。因为do()ng-if注册的监视表达式调用,所以每次计时器触发时也会调用它。

如果您不想这样做,请不要使用$interval;只需使用正常的setInterval调用,但请注意,您在回调中修改的任何数据都不会导致Angular模板更新。不建议采用这种方法。相反,如果每秒调用do()的问题是do()过于昂贵,请找一种方法使其更便宜,例如通过缓存结果。

答案 1 :(得分:1)

是的,我认为这是因为$interval会导致摘要传递,并且每次发生这种情况时都会对ng-if进行测试,因此每次都会对$ scope.do()进行评估。

我认为传递一个好主意并不是一个好主意。