在ngAfterViewInit中使用已破坏的视图进行changeDetection

Tom*_*ley 1 javascript angular

我工作的组织中的私有(但开放源代码)Angular程序包具有如下代码:

ngAfterViewInit(): void {
  setTimeout(() => {
    this.changeDetector.detectChanges();
    // do more things
  });
}
Run Code Online (Sandbox Code Playgroud)

我们在应用程序中实现此程序包(该程序包是为了引入通用的组件,以便组织中的前端开发人员不必多次实现事物,并且必须使用通用的设计语言来保持一致性)。但是,在使用该组件时,会调用它,并反复显示然后销毁该组件,最终它将停止工作,并在控制台中出现此错误:

Error: ViewDestroyedError: Attempt to use a destroyed view: detectChanges
Run Code Online (Sandbox Code Playgroud)

我正在尝试寻找一种方法,以确保如果组件已被破坏,则上述代码不会运行。我考虑过使用ngOnDestroy生命周期方法:

ngOnDestroy(): void {
  this.changeDetector.detach();
}
Run Code Online (Sandbox Code Playgroud)

但是我不确定我还可以放入那里以检查视图是否正常。我还想到了类似的东西:

if (!this.changeDetector.destroyed) {
  this.changeDetector.detectChanges();
}
Run Code Online (Sandbox Code Playgroud)

但是没有像这样的destroyed存在ChangeDetectorRef

确保即使重复显示和销毁该错误也不会显示并且组件正常工作的正确方法是什么?

Tom*_*ley 10

我认为我发现的最佳解决方案是使用!ViewRef.destroyed,如果返回的是“真”,请继续进行,否则不要这样做。

if (!(this.changeDetector as ViewRef).destroyed) {
  this.changeDetector.detectChanges()
  // do other tasks
}
Run Code Online (Sandbox Code Playgroud)