指令测试中的$ apply vs $ digest

时间:2013-09-09 11:59:37

标签: angularjs angularjs-directive

如果我有一个指令来响应作用域上特定属性的状态,并且我想在我的测试中更改该属性并验证它是否正确响应,这是进行更改的最佳方式?

我见过这两种模式:

scope.$apply(function() {
    scope.myAttribute = true;
});

scope.myAttribute = true;
scope.$digest();

它们之间有什么区别,哪个更好,为什么?

2 个答案:

答案 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方法会触发一个摘要周期。