【问题标题】:When should I call $digest instead of $apply?我什么时候应该调用 $digest 而不是 $apply?
【发布时间】:2015-09-08 09:54:47
【问题描述】:

我都看过

$rootScope.$apply();

$rootScope.$digest();

在工厂内使用。不过Angular docs 说:

通常,您不会直接在控制器中调用 $digest() 或 指令。相反,您应该调用 $apply() (通常从 指令),这将强制执行 $digest()。

如果你想在 $digest() 被调用时得到通知,你可以 使用 $watch() 注册一个不带监听器的 watchExpression 函数。

在单元测试中,你可能需要调用 $digest() 来模拟作用域 生命周期。

不直接调用$digest 的好处之一是可以避免运行无限循环。

在任何情况下应该使用$digest 而不是$apply(除了测试,如引用中所述)?

【问题讨论】:

    标签: javascript angularjs angularjs-scope


    【解决方案1】:

    当您的应用程序变得足够大以至于摘要变得过于昂贵时,您可以在确定不会对应用程序的其他部分造成副作用的范围内调用摘要。

    例如,您可能引入了一个 jQuery 日历插件,您通常会调用 $apply 来观察它与范围的绑定。此日历可能用于反馈表单,因此可以说它独立于您的应用程序的其余部分,这可能是一个拥有数千名观察者的大型实时数据馈送。

    您日历上的 scope.apply 将遍历您的整个应用程序,并在不必要时对您的所有数千名观察者进行实时供稿的脏检查。在这种情况下,您应该调用 $scope.$digest(),因为您知道只有日历模型发生了变化。

    【讨论】:

    • 有道理,谢谢。您能否提供一些支持您所说的资源?
    • 来源:我,我是 Angular 开发人员,我是资源 - 根据我的经验
    【解决方案2】:

    我认为这里的文档没有帮助。据我所知:

    • $digest 将处理当前作用域及其子作用域的所有观察者。
    • $apply() 或多或少是$rootScope.$digest包装器,因此将在所有范围内运行完整的摘要。

    不像文档说的那样,您可以使用这两种方法从 Angular 外部将更新拉入摘要周期。如前所述,$apply 可能会调用完整的摘要循环,即$rootScope.$digest()。相反,调用 $digest 很可能会阻止这种情况发生,并且对性能更好。

    如果您想绝对确定 Angular 能够识别更改,请使用 $apply。如果您知道自己在做什么并且只需要更新当前范围(或其子范围),请使用$digest

    【讨论】:

    • 所以调用$rootScope.$digest()$rootScope.$apply()没有区别?
    • 一个细微但非常重要的区别。在我的回答中标记为粗体。
    • 您说调用 $digest 可能只会阻止 rootScope 摘要。在什么情况下,对子作用域的 $digest 调用会触发根作用域摘要?
    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2016-08-09
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多