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



下面是一个非常常见的测试指令的通用场景:

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.$digest()执行摘要循环并开始脏检查。说了这么多,我的问题是为什么在调用$compile之后必须调用scope.$digest以使一切在这种情况下正常工作?

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

最新更新