Javascript 在ngAfterViewInit中使用销毁视图进行变更检测

Javascript 在ngAfterViewInit中使用销毁视图进行变更检测,javascript,angular,Javascript,Angular,在我工作的组织中,一个私有(但开源)Angular软件包的代码如下所示: ngAfterViewInit(): void { setTimeout(() => { this.changeDetector.detectChanges(); // do more things }); } if (!this.changeDetector['destroyed']) { this.changeDetector.detectChanges(); } 我们在我们的

在我工作的组织中,一个私有(但开源)Angular软件包的代码如下所示:

ngAfterViewInit(): void {
  setTimeout(() => {
    this.changeDetector.detectChanges();
    // do more things
  });
}
if (!this.changeDetector['destroyed']) {
    this.changeDetector.detectChanges();
}
我们在我们的应用程序中实现这个包(这个包是为了引入通用组件,这样整个组织的前端开发人员就不会多次实现这些东西,并且为了一致性而强制使用通用设计语言)。但是,当使用该组件时,它会被调用,并反复显示然后销毁该组件,最终它将停止工作,控制台中会出现以下错误:

Error: ViewDestroyedError: Attempt to use a destroyed view: detectChanges
我试图找到一种方法,确保在组件已经销毁的情况下,上面的代码不会运行。我考虑过使用
ngondestory
生命周期方法:

ngOnDestroy(): void {
  this.changeDetector.detach();
}
但我不确定我会在那里放些什么来检查视图是否正常。我还想到了这样的事情:

if (!this.changeDetector.destroyed) {
  this.changeDetector.detectChanges();
}
但是
ChangeDetectorRef
上不存在类似于
销毁的


哪种正确的方法可以确保此错误不显示且组件工作,即使在重复显示和销毁它时也是如此?

我认为销毁确实有效,但语法如下:

ngAfterViewInit(): void {
  setTimeout(() => {
    this.changeDetector.detectChanges();
    // do more things
  });
}
if (!this.changeDetector['destroyed']) {
    this.changeDetector.detectChanges();
}

显然,只要保留Ngondestry钩子上的代码就行了。

我认为我找到的最佳解决方案是使用
!ViewRef.destromed
如果返回truthy,则继续,否则不继续

if (!(this.changeDetector as ViewRef).destroyed) {
  this.changeDetector.detectChanges()
  // do other tasks
}

谢谢-这样做会在生成项目时产生致命错误,
元素隐式地具有“any”类型,因为类型“ChangeDetectorRef”没有索引签名。
。我知道我可以通过在类型定义(如中)中添加
[key:string]:any
来保存它,但是如果我必须修改Angular的工作方式,这并不是一个真正的解决方案。非常感谢,我已经处理这个问题很长时间了,它为我解决了(至少到现在为止)。我已经取消了所有观察者的订阅,即使这个错误因为我检测到了更改()而不断出现;在我的代码中。是否有一个特殊的原因导致在视图初始化之后立即触发更改检测器?更重要的是,是否有理由通过setTimeout(而不是顺序)异步完成此操作?@JeanPaulA。我不确定,因为我没有使用源代码的经验,我不认为重构它是我的工作(我也没有时间,因为还有其他事情需要处理)。
setTimeout
上方有一条注释,上面写着:
//必须这样做以防止更改检测树崩溃,因为我们正在重新调整
,在更改检测行上方,有一行将全部外部加载的数据重新加载到组件中,自上次渲染以来可能已经发生了很大的变化。我理解。。。该组件位于模板组件或管线组件之上吗?它是如何使用的?例如,它是绑定到ngFor或ngIf的模板组件吗?我能想到的是
detectChanges
方法和组件的创建/删除之间存在竞争条件。另请注意,理想情况下,数据加载应通过路由守卫(如果可能)或在ngOnInit上完成,而不是afterViewInit@JeanPaulA. 它是一个模板组件,用于呈现表格数据。据我所知,它没有使用任何
*ng
指令