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

Angularjs 为什么在单元测试中在$compile(element)(scope)之后调用scope.$digest(),angularjs,jasmine,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? })) var元

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

var element,scope;

beforeEach(inject(function ($rootScope,$compile) {
  scope = $rootScope.$new()
  element = angular.element('<div my-directive></div>')
  $compile(element)(scope)
  scope.$digest(); //why?
}))
var元素、范围;
beforeach(注入(函数($rootScope,$compile){
scope=$rootScope.$new()
元素=角度。元素(“”)
$compile(元素)(范围)
scope.$digest();//为什么?
}))

我理解
$compile(element)
返回一个函数,该函数接受范围参数并将其提供给元素的指令。我还了解,
scope.$digest()
执行摘要循环并开始脏检查。话虽如此,我的问题是为什么在调用
$compile
之后必须调用
作用域。$digest
,以使一切都在这种情况下工作

这是测试指令的通用代码
$Compile
将模板与作用域绑定,并执行
链接
函数和
$digest
/
$apply
刷新可能已被
链接
修改的模型的绑定
ng单击处理程序或控制器函数中调用
$compile
时,整个执行在
$digest
循环中运行。Angular以这样一种方式构建,即动态添加的项(在执行此循环时)在同一个周期中执行。这就是为什么您实际上没有注意到差异,也没有意识到编译后绑定求值的必要性。然而,在单元测试中情况就不同了,在单元测试中,您应该告诉angular手动执行
$digest
循环。例如,在测试
$q
承诺时,这通常会导致问题