AngularJS是否总是知道什么时候发生了变化,是时候更新?

时间:2015-08-29 17:24:44

标签: javascript angularjs

我正在通过 Lukas Ruebbelke 阅读AngularJS in Action,以清除关于AngularJS如何在分子水平上工作的脏检查概念。

作者提出,

  

在摘要周期中,所有观察范围对象的表达式   被评估。当监视表达式检测到$ scope属性时   更改,然后触发侦听器功能。   如果没有AngularJS了解它,偶尔会更改一个属性。你
  可以手动启动di $ apply的摘要周期。

所以,我的问题是当我需要手动启动这个摘要周期时,真实Web应用程序中的情况是什么。这些情况经常出现吗?请建议。

2 个答案:

答案 0 :(得分:2)

每当异步回调从非角度库返回时,都会出现这种情况。 e.g。

setTimeout(function() {
    $scope.myVar = 1;
    //Angular doesn't know when setTimeout finishes 
    //so you have to manually kick off a digest cycle.
    $scope.$apply();
});

Angular有$timeout服务,负责为你开始一个摘要周期,但是如果你使用一些第三方库进行回调并且没有角度包装器那么你将不得不这样做

答案 1 :(得分:1)

例如,当使用提供某种数据的第三方库时,可能会发生这些情况。

假设您使用库-X,当事件发生并且有新数据可用时,它会触发事件,您希望使用AngularJS进行渲染。 在这些原因中,如果您只是直接设置变量,AngularJS不会知道范围中的数据会发生变化。

这就是为什么你应该只修改$ apply函数中的范围变量:

function MyController($scope) {
    $scope.load = function() {
        $scope.message = 'Loading...';
        setTimeout(function() {
            $scope.$apply(function () {
                $scope.message = 'Finished loading!';
            });
        }, 2000);
    }
}

还建议使用$scope.$apply(function () { /* update code */ })而不是单$scope.$apply()次调用,因为它会正确捕获错误并运行diggest而不管任何错误。