Angular 2 - 替换$ scope.$ apply?

Jaa*_*rus 21 javascript angularjs-scope angular

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

摘自Minko Gechev的博客文章:

没有更多$ scope.$ apply

但是AngularJS怎么知道它的执行环境之外的任何东西都取而代之?让我们思考一下变化的来源:

  • 的setTimeout
  • 的setInterval
  • 提示(是的,有人还在使用它......)
  • XMLHttpRequest的
  • 的WebSockets

  • ...

答案是:

在此输入图像描述

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

Hel*_*ate 25

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

要么

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


Bla*_*ise 15

所以,做这一切的猴子补丁库是zone.js.

jQuery.fadeIn电话setInterval,setInterval猴子修补,只要你jQuery.fadeIn在一个内部打电话zone.run.

zone.forkzone.run替换$scope.$apply,但它是不同的,因为它在异步事件完成时检测到自己,而你必须在知道事情完成后$scope.$apply 手动调用.另请参阅此问题+答案:使用zone.js从任何地方检测当前执行上下文?

如果浏览器公开了一些未涵盖的新异步API?

我猜他们也会补丁.

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