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

标签 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?
}))

我了解 $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/

相关文章:

angularjs - 从地址栏接收直接页面访问事件,Angular JS - ui-router

javascript - 如何强制 Puppeteer 等待非常大的 HTML 表中的所有行完全加载并显示在 DOM 中

javascript - 类型错误:jasmine.getEnv().currentSpec 为空

angularjs - 如何测试 Controller 内服务的响应

javascript - Jasmine 在尝试耙动/启动时停顿?

node.js - 在带有 windows 主机的 ubuntu 虚拟服务器上运行 Node、Yeoman、Grunt 等

javascript - Angular.js : How to update data from one HTML to other HTML which uses same controller

javascript - 处理来自上游的本地 Web 存储更改的推荐方法是什么?

angular - Chrome 87.0.4280 (Windows 10.0.0) : Executed 0 of null (skipped 229) ERROR (34. 875 秒/0 秒)

javascript - 带有 templateUrl 和隔离范围的 Angular Testing 指令