$scope.$apply
将不再是Angular 2的一部分。那么,如果在常规角度执行上下文之外更改了任何绑定属性,我们如何让Angular知道更新DOM?
取自a blog post by Minko Gechev:
没有更多$ scope。$ apply
但是AngularJS怎么知道它的执行环境之外的任何东西都取而代之?让我们考虑一下变化的来源:
- 的setTimeout
- 的setInterval
- 提示(是的,还有人还在使用它......)
- 的XMLHttpRequest
的WebSockets
...
答案是:
我理解修补浏览器内置的javascript函数来通知对Angular的任何更改是可以以相对安全的方式完成的(不会引入细微的错误)并且对开发人员来说非常方便。但是第三方API(例如jQuery.fadeIn
)或浏览器是否公开了一些未涵盖的新异步API呢?什么是旧$scope.$apply
的替代品?
答案 0 :(得分:25)
NgZone
您的构造函数中的private zone: NgZone
this.zone.run(() => {});
您通常会scope.$apply
或
ChangeDetectorRef
private chRef: ChangeDetectorRef
chRef.detectChanges();
答案 1 :(得分:15)
所以执行所有这些猴子修补的库是zone.js。
只要您在jQuery.fadeIn
内拨打setInterval
,就会{p} setInterval
来电jQuery.fadeIn
,zone.run
进行修补。
zone.fork
和zone.run
替换$scope.$apply
,但它有所不同,因为它在异步事件完成时检测到自身,而您必须调用$scope.$apply
当你知道事情已经完成时,手动。
另见这个问题+答案:Use zone.js to detect current execution context from anywhere?
如果浏览器公开了一些未涵盖的新异步API?
我猜他们也会修补它。
如果其他一切都失败,您仍然可以手动拨打zone.afterTask()
我想这就是你要找的东西:)