我一直在研究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
是,我怎样才能解决这个问题?
请记住,我不仅要寻找代码解决方案,还要寻找解释解释的原因。如果代码解决方案可能会出现,它将不解释自己。
答案 0 :(得分:1)
$timeout
是setTimeout()
的愤怒版本,即它以一种触发摘要周期的方式编码。 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已经对这些实用程序/对象进行了自己的抽象,这样当它们完成时,摘要周期将会发生任何变化。