我见过两者
$rootScope.$apply();
和
$rootScope.$digest();
在工厂内使用 . 但是Angular docs说:
通常,您不直接在控制器或指令中调用$ digest() . 相反,你应该调用$ apply()(通常来自一个指令),这将强制$ digest() . 如果您希望在调用$ digest()时收到通知,则可以使用$ watch()注册watchExpression函数而不使用侦听器 . 在单元测试中,您可能需要调用$ digest()来模拟范围生命周期 .
不直接调用 $digest
的一个好处是避免运行无限循环 .
是否有人应该使用 $digest
而不是 $apply
(除了测试之外,如引用中所述)?
2 回答
当您的应用程序变得足够大以至于摘要变得非常昂贵时,您可以在范围内调用摘要,确保不会对应用程序的其他部分造成副作用 .
例如,您可能已经引入了一个jQuery日历插件,您通常会调用$ apply on来观察其与范围的绑定 . 此日历可能用于反馈表单,因此它可以独立于您的应用程序的其余部分,这可能是一个拥有数千名观察者的大型实时数据源 .
日历上的scope.apply将遍历整个应用程序,并在没有必要的情况下对所有数千名观察者进行脏检查以获取实时Feed . 在这种情况下,您应该调用$ scope . $ digest(),因为您只知道日历模型已更改 .
我认为文档在这里没有用 . 我所知道的:
$digest
将处理 current scope and its children 的所有观察者 .$apply()
或多或少是 wrapper around $rootScope.$digest ,因此将在所有范围内运行完整摘要 .与doc说的不同,您可以使用这两种方法将更新从Angular外部提取到摘要周期 . 如前所述,
$apply
可能会调用完整的摘要周期,这意味着$rootScope.$digest()
. 相反,调用$digest
很可能会阻止这种情况发生,并且性能更好 .如果您想绝对确定Angular可以识别更改,请使用
$apply
. 如果您知道自己在做什么,只需更新当前范围(或其子项),请使用$digest
.