尝试使用已销毁的视图:尽管视图已分离,但 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();
}
}
}
我有一个组件执行一些服务调用并获得承诺。在 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();
}
}
}