$在指令testing中应用vs $摘要
如果我有一个指令来响应作用域上特定属性的状态,并且我想在testing中更改该属性并validation它是否正确响应,那么执行此更改的最佳方法是什么?
我已经看到这两种模式:
scope.$apply(function() { scope.myAttribute = true; });
和
scope.myAttribute = true; scope.$digest();
他们之间有什么区别,哪个更好,为什么?
scope.$digest()
将会在当前范围内以及所有子节点上触发观察者。 scope.$apply
将评估传递的函数并运行$rootScope.$digest()
。
第一个是更快,因为它需要评估当前的范围和孩子的观察员。 第二个比较慢,因为它需要评估$rootScope
监视器以及它的子范围。
当其中一个观察者发生错误,并且使用scope.$digest
,它不会通过$exceptionHandler
服务来处理,所以你需要自己处理exception。 scope.$apply
在内部使用一个try-catch
块,并将所有exception传递给$exceptionHandler
。
正如文档本身提到$ digest循环是在$scope.$apply
。 根据范围的开发人员指南
在评估expression式之后,$ apply方法执行一个$摘要。 在$ digest阶段,范围检查所有$ watchexpression式并将它们与先前的值进行比较。
根据Scope API 文档
通常你不要直接在控制器或指令中调用$ digest()。 相反,调用$ apply()(通常来自一个指令)会强制$ digest()。
所以你不应该明确地调用$digest
,你调用$apply
方法会触发一个摘要循环。