首页 文章

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

提问于
浏览
1

我见过两者

$rootScope.$apply();

$rootScope.$digest();

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

通常,您不直接在控制器或指令中调用$ digest() . 相反,你应该调用$ apply()(通常来自一个指令),这将强制$ digest() . 如果您希望在调用$ digest()时收到通知,则可以使用$ watch()注册watchExpression函数而不使用侦听器 . 在单元测试中,您可能需要调用$ digest()来模拟范围生命周期 .

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

是否有人应该使用 $digest 而不是 $apply (除了测试之外,如引用中所述)?

2 回答

  • 6

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

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

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

  • 2

    我认为文档在这里没有用 . 我所知道的:

    • $digest 将处理 current scope and its children 的所有观察者 .

    • $apply() 或多或少是 wrapper around $rootScope.$digest ,因此将在所有范围内运行完整摘要 .

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

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

相关问题