以下是用于测试指令的非常常见的通用场景:
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()
执行摘要循环并开始脏检查。说了这么多,我的问题是为什么你必须调用 scope.$digest
调用 $compile
后让一切在这种情况下正常工作?
最佳答案
这是用于测试指令的通用代码。 $Compile
将模板与作用域绑定(bind)并执行link
功能和$digest
/$apply
刷新可能已被 link
修改的模型的绑定(bind).
当您调用 $compile
里面 ng-click
处理程序或 Controller 函数中,整个执行在 $digest
内运行环形。 Angular 的构建方式是动态添加的项目(在执行此循环时)在同一循环中执行。这就是为什么您实际上并没有注意到差异,也没有意识到编译后需要绑定(bind)评估。但是在单元测试中它是不同的,你应该告诉 Angular 执行 $digest
手动循环。这通常会导致测试时出现问题 $q
例如, promise 。
关于angularjs - 为什么在单元测试中在 $compile(element)(scope) 之后调用 scope.$digest(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31373772/