触发角度法时不止一个结果

时间:2014-10-07 12:49:55

标签: javascript angularjs

我正在写一些有角度的东西(仍在学习),并发现虽然我的射击方法我看到重复的结果。 我准备了非常简单的代码来模拟这个 的index.html:


    
      {{show()}}
    

(function(){
    var app = angular.module('test', []);

    app.controller('testController', ['$scope', function($scope){
        $scope.show = function(){
            console.log('test');
        };
    }]);
})();

在chrome控制台中我可以看到' test'显示3次..为什么会这样? 我写的其他脚本中有这个问题,有时会显示两次,我做错了什么? 有人可以告诉我吗? 感谢

2 个答案:

答案 0 :(得分:2)

你看到的是Angular的$摘要周期的结果。

https://docs.angularjs.org/api/ng/type/$rootScope.Scope

来自Angular docs ......

  

$消化();   处理当前范围的所有观察者及其子女。因为观察者的监听器可以改变模型,所以$ digest()不断调用监视器,直到不再有监听器被触发为止。这意味着可以进入无限循环。此函数将抛出“超出最大迭代限制”。如果迭代次数超过10次。

每个$ digest将评估所有观察者,在您的情况下,每次都会调用您的函数。

如果您对如何发生这种情况非常好奇,那么在Angularjs源代码中的$ digest函数上放置一个断点,您将看到您的函数作为该循环的一部分被调用。基本上进入do-while循环并执行你的函数,直到它的内部逻辑满足,不再需要更多的摘要周期。对于您的代码所展示的简单案例,这恰好是三次。

上述循环的精简版本是您的函数执行一次以初始化$ digest循环中的监视值。然后在循环循环中对其进行评估,以查看是否有任何更改,从而导致对函数的第二次调用。最后,第三次执行发生,如果值没有改变,$ digest逻辑满足于我们可以结束循环。

答案 1 :(得分:-1)

如何在HTML中使用它:

{{show}}