为什么在单元测试中的$ compile(element)(范围)之后调用scope。$ digest()

时间:2015-07-13 00:02:16

标签: angularjs jasmine

以下是用于测试指令的非常常见的通用场景:

var element,scope;

beforeEach(inject(function ($rootScope,$compile) {
  scope = $rootScope.$new()
  element = angular.element('<div my-directive></div>')
  $compile(element)(scope)
  scope.$digest(); //why?
}))

我理解$compile(element)返回一个带有scope参数的函数,并将其提供给元素的指令。我也明白scope.$digest()执行摘要循环并开始脏检查。尽管如此,我的问题是为什么在调用scope.$digest之后必须致电$compile以使一切在这种情况下有效?

1 个答案:

答案 0 :(得分:9)

这是用于测试指令的通用代码。 $Compile将模板与范围绑定并执行link函数,$digest / $apply刷新可能已由link修改的模型的绑定。
当您在$compile处理程序或控制器函数中调用ng-click时,整个执行将在$digest循环内运行。 Angular以这样的方式构建,即动态添加的项(在执行此循环时)在同一循环中执行。这就是为什么你实际上没有注意到差异,并且在编译之后没有意识到绑定评估的必要性。但是在单元测试中它的方式不同,你应该告诉angular手动执行$digest周期。例如,在测试$q承诺时,这通常会导致问题。