使用两种不同的方法可以获得相同的结果:
doSomething();
$scope.$digest();
或
$scope.$apply(function() {
doSomething();
});
那么有什么不同以及什么时候使用?
答案 0 :(得分:1)
两者都会做同样的事情。但是,使用$scope.apply()
包装为函数是最佳实践。为什么因为当你在$scope.apply()
中包装内容时,可以为此编写catch
块。 因此,您可以发现可能遇到的任何例外情况。
答案 1 :(得分:1)
处理当前范围及其子项的所有观察者。因为观察者的监听器可以改变模型,所以$ digest()不断调用监视器,直到不再有监听器被触发为止。这意味着可以进入无限循环。此函数将抛出“超出最大迭代限制”。如果迭代次数超过10次。
通常,您不直接在控制器或指令中调用$ digest()。相反,你应该调用$ apply()(通常来自一个指令),这将强制$ digest()。
如果您希望在调用$ digest()时收到通知,可以使用$ watch()注册watchExpression函数,但不能使用监听器。
在单元测试中,您可能需要调用$ digest()来模拟范围生命周期。
答案 2 :(得分:0)
您可以选中$digest
来检查$scope.$$phase
是否已经在进度中。
if(!$scope.$$phase) {
//use anyone yours: $digest or $apply
}
scope.$digest()
会激发观察者对当前范围及其所有孩子的看法。 scope.$apply
将评估传递的函数并运行$rootScope.$digest()
。
答案 3 :(得分:0)