Angular 2 - 替代 $scope.$apply?

Angular 2 - Substitute for $scope.$apply?

$scope.$apply 将不再是 Angular 的一部分 2. 如果任何绑定属性已被删除,我们如何让 Angular 知道更新 DOM在常规 angular 执行上下文之外更改?

取自a blog post by Minko Gechev:

No more $scope.$apply

But how then AngularJS knows that anything outside it’s execution context has taken a place? Lets think where the changes might come from:

  • setTimeout
  • setInterval
  • prompt (yeah, there are people who still use it…)
  • XMLHttpRequest
  • WebSockets

答案是:

我知道修补浏览器内置 javascript 功能以通知对 Angular 的任何更改是可以以相对安全的方式完成的事情(不会引入细微的错误)并且会对开发者来说非常方便。但是第三方 API(例如 jQuery.fadeIn)或者如果浏览器公开了一些未涵盖的新异步 API 怎么办?旧 $scope.$apply 的替代品是什么?

所以做所有这些猴子补丁的库是 zone.js

jQuery.fadeIn 调用 setIntervalsetInterval 是猴子补丁,只要你在 zone.run.

内调用 jQuery.fadeIn

zone.forkzone.run 有点取代 $scope.$apply,但它是不同的,因为它会在异步事情完成时检测自己,而你必须调用 $scope.$apply 手动 当你知道事情已经完成。 另请参阅此问题+答案:Use zone.js to detect current execution context from anywhere?

if the browser exposes some new asynchronous API which isn't covered?

我想他们也会修补那个。

如果一切都失败了,您仍然可以手动调用zone.afterTask()
我想这就是您要找的:)

  1. 从核心导入 NgZone
  2. private zone: NgZone 在你的构造函数中
  3. this.zone.run(() => {}); 通常 scope.$apply

  1. ChangeDetectorRef
  2. private chRef: ChangeDetectorRef
  3. chRef.detectChanges();