在angular2中,使用zone.run vs changeDetecotor.markForCheck()

时间:2016-06-05 15:31:46

标签: angular

我想知道使用一个优于另一个的优势或劣势:

 constructor(private app:ApplicationRef, private ref:ChangeDetectorRef) {
    this.ref.markForCheck();
    // OR
    this.ref.detectChanges()  
    // will do same thing?
 ...

VS

zone.run

(() => doSomething())
    ...

VS

  app.tick();

它们基本上都会标记组件以检查和更新/重绘UI。

我知道app.tick()会为整个应用做到这一点,但在我的测试中,它并没有真正强制用户界面更新。

zone.runmarkforCheck都强制用户界面在下一个区域周期检查时更新,那么为什么要使用其中一个呢?

1 个答案:

答案 0 :(得分:1)

如果您运行仅影响当前组件的代码,例如

someServiceThatRunsOutsideZone.getData()
.subscribe(data => {
  this.data = data;
  this.ref.markForCheck();
});

this.ref.markForCheck()就好了。

如果你在Angulars区域之外做例如this.router.navigateXxx(...)那么很难知道this.ref.markForCheck()是否会涵盖可能通过这个相当复杂的操作改变状态的所有元素。

此外,如果this.router.navigateXxx(...)调用某些异步调用,则markForCheck将在这些异步调用完成之前运行,并且不会在最后调用更改检测,因为它可能是必需的。

this.zone.run(() => this.router.navigateXxx(...))

没关系,因为this.router.navigateXxx()并且该调用调用的所有代码(sync和async)都将在Angulars区域内运行并使用其修补的API。

我不知道app.tickmarkForCheck之间的确切区别,但app.tick也确实存在上述markForCheck

的缺点