如何正确使用AngularJS摘要周期

时间:2016-02-15 19:55:08

标签: javascript angularjs angular-digest

我一直在研究AngularJS Digest循环的注意事项,我想更好地理解正确使用它与正确使用之间的分离。

例如,如果我有一个看起来像这样的AngularJS代码:

var myApp = angular.module("testApp", []);

myApp.controller("testController", ["$scope", "$timeout", function($scope, $timeout){
    setTimeout(function(){
        $scope.username = "Test User name";
    }, 3000);

    $timeout(function(){
        $scope.username = "AngularJS User name";
    }, 3000);
}]);

为什么setTimeout没有被用作摘要周期的一部分,而$timeout是,我怎样才能解决这个问题?

请记住,我不仅要寻找代码解决方案,还要寻找解释解释的原因。如果代码解决方案可能会出现,它将不解释自己

3 个答案:

答案 0 :(得分:1)

$timeoutsetTimeout()的愤怒版本,即它以一种触发摘要周期的方式编码。 setTimeout()是一个简单的Javascript函数,它对Angular或摘要周期一无所知。由于setTimeout()不是一个简单的JS对象,因此Angular不能$watch它。

因此,像$timeout这样的功能的全部意义在于它们是某些Javascript功能的角度友好版本。

答案 1 :(得分:1)

$timeout()setTimeout()不一样,$ timeout 有角度化

它在内部使用promise($ q service),它会在每个摘要周期后自动解析。而setTimeout()只是在队列中注册回调函数的技巧。

如果你想让setTimeout()成为摘要循环的一部分,请在$ scope中调用它。$ apply():

setTimeout(function(){
    $scope.$apply(function(){
        $scope.username = "Test User name";
    });
}, 3000));

答案 2 :(得分:1)

更通用的解释是setTimeout在角度内部不起作用,因为它将其回调放在事件循环上,角度不看。如果您要直接创建XMLHttpRequest而不是$http,则会出现同样的情况。

Angular已经对这些实用程序/对象进行了自己的抽象,这样当它们完成时,摘要周期将会发生任何变化。