尝试使用已销毁的视图:尽管视图已分离,但 detectChanges 事件

Attempt to use a destroyed view: detectChanges event though the view is detached

我有一个组件执行一些服务调用并获得承诺。在 Promises 得到解决后,我正在做 detectChanges。但有时当组件视图已经被销毁时,承诺正在被解决,例如用户关闭的选项卡(我们应用程序的内部选项卡)。在那种情况下,我得到 ViewDestroyedError: Attempt to use a destroyed view: detectChanges。即使我已经分离了 tab.component 的销毁阶段的视图。我的问题是我在这里做错了什么?

我曾尝试在销毁阶段从更改检测中分离视图,但没有成功,在销毁阶段后解决了承诺,并且仍然调用了 detectChanges。我知道 ngOnDestroy 实际上并没有破坏 class 并且其中的代码将在垃圾收集阶段被破坏。

这是我的 tab.component 中导致问题的示例代码

const promises:Promise<any>[] = [];
_.each(types, (type:string) => {
  promises.push(this.service.getResultsBy(type))
})
Promise.all(promises)
.then((data) => {
  //some code here
  this.cd.detectChanges();
})

ngOnDestroy 中,我将视图与 C.D

分离
ngOnDestroy() {
    this.cd.detach();
  }

在这种情况下,承诺对我来说很重要,因为即使组件被销毁,我也确实需要做一些 calculations/state 保存。我只想了解如何充分分离视图,以便我在 promise 中的代码不会导致更改检测尝试。

不需要从 ngOnDestroy 上的更改检测中分离出来,也无助于解决此错误。但是,您不能在调用 ngOnDestroy 之后调用 detectChanges。使用 observable,您可以取消订阅 ngOnDestroy 中的 observable。无法取消订阅 Promise,因此您需要在组件中保留一个标志。

export class MyComponent {

  private destroyed = false;

  ngOnDestroy() {
    this.destroyed = true;
  }

  triggerChangeDetection() {
    if (!this.destroyed) {
      this.cd.detectChanges();
    }
  }

}