如果我有一个指令来响应作用域上特定属性的状态,并且我想在我的测试中更改该属性并验证它是否正确响应,这是进行更改的最佳方式?
我见过这两种模式:
scope.$apply(function() {
scope.myAttribute = true;
});
和
scope.myAttribute = true;
scope.$digest();
它们之间有什么区别,哪个更好,为什么?
答案 0 :(得分:202)
scope.$digest()
会激发观察者对当前范围及其所有孩子的看法。 scope.$apply
将评估传递的函数并运行$rootScope.$digest()
。
第一个更快,因为它需要评估观察者当前范围及其子女。第二个是较慢的,因为它需要评估$rootScope
及其所有子范围的观察者。
当其中一位观察者发生错误并且您使用scope.$digest
时,它不会通过$exceptionHandler
服务处理,因此您需要自己处理异常。 scope.$apply
在内部使用try-catch
块,并将所有例外传递给$exceptionHandler
。
答案 1 :(得分:12)
正如文档本身所提到的那样,只要你$scope.$apply
,就会形成$ digest循环。根据{{3}}
在评估表达式后,$ apply方法执行$ digest。 在$ digest阶段,范围检查所有$ watch表达式 并将它们与之前的值进行比较。
根据Scope API scope
通常你不直接在控制器或中调用$ digest() 指令。而是调用$ apply()(通常来自a 指令)将强制$ digest()。
所以你不应该明确地调用$digest
,你调用$apply
方法会触发一个摘要周期。