Angular 2 - 替换$ scope。$ apply?

时间:2015-06-09 14:15:12

标签: javascript angularjs-scope angular

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

取自a blog post by Minko Gechev

  

没有更多$ scope。$ apply

     

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

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

  •   
  • ...

  •   

答案是:

enter image description here

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

2 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:15)

所以执行所有这些猴子修补的库是zone.js

只要您在jQuery.fadeIn内拨打setInterval,就会{p} setInterval来电jQuery.fadeInzone.run进行修补。

zone.forkzone.run替换$scope.$apply,但它有所不同,因为它在异步事件完成时检测到自身,而您必须调用$scope.$apply当你知道事情已经完成时,手动。 另见这个问题+答案:Use zone.js to detect current execution context from anywhere?

  

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

我猜他们也会修补它。

如果其他一切都失败,您仍然可以手动拨打zone.afterTask() 我想这就是你要找的东西:)