【问题标题】:Does AngularJS always know when something has changed, it's time to update?AngularJS 总是知道什么时候发生了变化,是时候更新了吗?
【发布时间】:2015-08-29 17:24:44
【问题描述】:

我正在阅读 Lukas RuebbelkeAngularJS in Action,以明确关于 AngularJS 如何在分子水平上工作的脏检查概念。

作者提出,

在摘要周期中,作用域对象的所有监视表达式 被评估。当监视表达式检测到 $scope 属性具有 更改,然后触发侦听器函数。 有时,在 AngularJS 不知道的情况下更改了属性。你
可以通过 $apply 手动启动摘要循环。

所以,我的问题是,当我需要手动启动此摘要循环时,在真正的 Web 应用程序中会出现哪些情况。这些情况经常出现吗?请建议。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    这将在异步回调从非角度库返回时出现。例如

    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 服务,它负责为你启动一个摘要循环,但如果你使用的是一些第三方库,它接受回调并且没有角度包装器,那么你将不得不这样做。

    【讨论】:

    • AngularJS 不知道 setTimeout 何时结束,但它确实会发生在一个确定的时刻。您能否说明一下 $digest 在这种情况下会如何反应。
    【解决方案2】:

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

    假设您使用 library-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() 调用,因为它会正确捕获错误并运行摘要,而不管任何错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-05
      • 2010-09-15
      • 1970-01-01
      • 2010-12-17
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多