Angular2,Zones vs ChangeDetectorRef强制ui更新接收的数据

时间:2017-01-16 10:24:52

标签: angular

我有一个Angular2 applcation。它连接到SignalR服务并接收定期更新(每10秒)。这些更新通过发送器从angualr服务发送到组件。 我注意到,当新数据进入时,ui并不总是更新,有时会延迟10秒左右。

为了解决这个问题,我在组件中添加了对detectChanges()的调用...

this._signalrService.onGetData.subscribe((data: any) => {
            // update some data properties
            this._cd.detectChanges();
        });

我也使用了区域来实现同样的目标......

this._signalrService.onGetData.subscribe((data: any) => { 
            this._ngZone.run(() => {
            // update some data properties
            });
        });

基本上我想在组件接收数据时强制进行ui更新。

这些方法中的任何一种都是正确的吗?该区域应该放在其他地方吗?

1 个答案:

答案 0 :(得分:1)

我认为这是正确的方法。

  • 当更新对于包含问题代码的组件而言是更新时使用this._cd.detectChanges

  • 当更新也影响其他组件时,请使用this._ngZone.run(...)。一个常见的例子是使用router.navigate(...)

  • 也可以使用
  • 代替this._ngZone.run(...) ApplicationRef.tick()。它会导致整个应用程序的变更检测。