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

Gre*_*ion 5 jasmine angularjs

以下是用于测试指令的非常常见的通用方案:

var element,scope;

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

我理解$compile(element)返回一个函数,该函数接受一个scope参数并将其提供给元素的指令.我也明白scope.$digest()执行摘要循环并开始脏检查.尽管如此,我的问题是为什么你必须打电话给scope.$digest后呼叫$compile才能使这一切都能正常工作?

Kir*_*tin 9

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