$scope.$apply()
当我通过 Angular 应用程序中的 websocket 接收数据并且它可以工作时,我一直在使用更新模型的绑定。但它实际上做了什么,为什么需要调用它来实现更新?
3 回答
如果你调用$apply
提供的代码angular-context
,你可以在其中使用 Angular 提供的代码。
从链接:
Angular 通过提供自己的事件处理循环来修改正常的 JavaScript 流程。这将 JavaScript 拆分为经典和 Angular 执行上下文。只有在 Angular 执行上下文中应用的操作才能受益于 Angular 数据绑定、异常处理、属性监视等......
您还可以使用 $apply() 从 JavaScript 输入 Angular 执行上下文。请记住,在大多数地方(控制器、服务),处理事件的指令已经为您调用了 $apply。只有在实现自定义事件回调或使用第三方库回调时,才需要显式调用 $apply。
简单地说:
- (可选)处理作为参数传递给它的表达式。
- 在 $rootScope 上调用 $digest()。
我还写了一篇关于 $apply、$digest 和 $watch 的作用以及它们如何协同工作的博客文章
我希望这会有所帮助。
来自Angular 文档:
$apply() 用于从 Angular 框架外部执行 Angular 表达式。(例如来自浏览器 DOM 事件、setTimeout、XHR 或第三方库)。因为我们正在调用 Angular 框架,所以我们需要执行适当的异常处理范围生命周期,执行 watch。
该文档还提供了它的伪代码:
function $apply(expr) {
try {
return $eval(expr);
} catch (e) {
$exceptionHandler(e);
} finally {
$root.$digest();
}
}
简而言之,$apply
评估一个表达式并触发一个摘要循环,使 Angular 执行所有注册的监视侦听器并更新任何视图绑定。
最后,您说过您一直在使用$apply
更新模型的绑定,但只有当更新来自 Angular 外部时才需要这样做。在大多数情况下,您不需要手动调用它。