Angular.js为什么本机异步函数不更新$ scope变量?

时间:2014-12-09 22:14:13

标签: angularjs asynchronous

我试图了解如何处理Angular中的视图更新。当我使用本机异步函数并且它回调更新$ scope变量时,视图不会更新。但是当我使用Angular异步函数时,视图会正确更新。例如:

// Example 1: This code updates the store in view
$timeout(function() {
    $scope.store = {
        name: 'MyName'
    }
}, 2000);

// Example 2: This code does not update the store in view
setTimeout(function () {
    $scope.store = {
        name: 'MyName'
    }
}, 2000);

为什么第二个例子没有更新商店?

1 个答案:

答案 0 :(得分:2)

这是因为Angular服务$timeout知道Angular运行时并且会正确注册更改。

在进行更改后,可以通过调用范围内的$ apply()来使用vanilla js捕获相同的行为:

setTimeout(function () {
  $scope.store = {
    name: 'MyName'
  }
  $scope.$apply();
}, 2000);

还有其他服务,如$window$interval,作为常规JS的便利包装,但它们确保任何$ scope更改都能正确注册到摘要周期。