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