1

我一直在研究 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我该如何解决这个问题?

请记住,我不仅在寻找代码解决方案,还在寻找为什么会发生这种情况的解释。尽管代码解决方案可能会出现,但它不会自行解释

4

3 回答 3

1

$timeout是 的一个角化版本setTimeout(),即它的编码方式可以触发一个摘要循环。setTimeout()是一个纯 Javascript 函数,对 Angular 或摘要循环一无所知。由于setTimeout()不是一个简单的 JS 对象,Angular 不能$watch

因此,拥有类似功能的全部意义$timeout在于它们是某些 Javascript 功能的角度友好版本。

于 2016-02-15T20:01:12.640 回答
1

$timeout()并且setTimeout()不一样, $timeout 是angularised

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

如果您希望 setTimeout() 成为摘要循环的一部分,请在 $scope.$apply() 中调用它:

setTimeout(function(){
    $scope.$apply(function(){
        $scope.username = "Test User name";
    });
}, 3000));
于 2016-02-15T20:20:39.027 回答
1

更通用的解释是它setTimeout在 angular 内部不起作用,因为它将其回调放在事件循环上,而 angular 不会监视。如果您要XMLHttpRequest直接创建一个而不是$http.

Angular 已经对这些实用程序/对象进行了自己的抽象,因此当它们完成时,摘要循环将获取任何更改。

于 2016-02-15T20:44:44.530 回答