我什么时候应该拨打$ digest而不是$ apply?

时间:2015-09-08 09:54:47

标签: javascript angularjs angularjs-scope

我见过两个

$rootScope.$apply();

$rootScope.$digest();

在工厂内使用。但是Angular docs说:

  

通常,您不直接在控制器或中调用$ digest()   指令。相反,你应该调用$ apply()(通常来自a   指令),它将强制$ digest()。

     

如果您希望在调用$ digest()时收到通知,则可以   使用$ watch()注册watchExpression函数,没有监听器。

     

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

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

是否有人应该使用$digest而不是$apply(除了报价中提到的测试之外)?

2 个答案:

答案 0 :(得分:6)

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

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

日历上的scope.apply会遍历整个应用程序,并在没有必要的情况下对所有成千上万的观察者进行脏检查以获取实时Feed。在这种情况下,您应该调用$ scope。$ digest(),因为您只知道日历模型已更改。

答案 1 :(得分:2)

我认为文档在这里没有用。据我所知:

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

与doc说的不同,你可以使用这两种方法将更新从Angular外部提取到摘要周期。如前所述,$apply可能会调用完整的摘要周期,即$rootScope.$digest()。相反,调用$digest很可能会阻止这种情况发生,并且对性能更有利。

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