ViewDestroyedError: попытка использовать уничтоженное представление - PullRequest
0 голосов
/ 07 июня 2019

(используется 8 угловых)

У меня сейчас проблема с моим кодом, использующим тему поведения.

Компонент A создает другой компонент B через фабрику компонентов. Теперь компонент A подписывается на компонент B, который знает, когда его удалять. В этом случае, когда есть ошибка в компоненте B, Компонент A изменит свое собственное состояние и вызовет Компонент B.destroy ().

Однако всякий раз, когда я запускаю этот метод, я получаю в журналах сообщение об ошибке

ERROR Error: ViewDestroyedError: Attempt to use a destroyed view: detectChanges

Я отключаю детектор изменений, прежде чем убрать его, но это, похоже, не помогает.

Вот код:

createComponent(): void {
    this.logger.debug('Widget: creating component based on type provided in config.');

    this.setWidgetLoading(true);
    this.componentFactory.createComponent(this.content, this.componentConfig).subscribe((componentRef) => {

        this.componentRef = componentRef;

        this.componentRef.instance.componentStatus.subscribe((status: Status) => {
          this.setComponentStatus(status);
        });

      }, (error: Error) => {
        this.setComponentStatus(StatusFactory.createErrorStatus(error));
        this.setWidgetLoading(false);
      },
      () => {
        this.setWidgetLoading(false);
        this.logger.debug('Widget: component created based on type provided in config.');
      });

  }

setComponentStatus(status: Status): void {

 case STATUS_TYPE.ERROR:
        this.setWidgetLoading(false);
        this.componentRef.changeDetectorRef.detach();
        this.componentRef.destroy(); //componentRef references the created component B
        return;
}

EDIT

вот два метода из компонента B

 ngAfterViewChecked(): void {
    if (this.config.mode === ENTITY_FORM_MODE.UPDATE && !this.data) {
      this.logger.debug('EntityCreationComponent: initialized for update mode but no data provided.');
      this.setErrorStatus(ErrorFactory.createError('initialized for update mode but no data provided.'));
    }
  }

  ngOnInit() {
    super.ngOnInit();
    this.entity = Object.assign(this.entity ? this.entity : {}, EntityFactory.createEntity(this.config.dataConfig.dataType));

    this.logger.debug('EntityCreationComponent: initialized.');
  }

1 Ответ

0 голосов
/ 07 июня 2019

Ок, я как-то исправил это.Похоже, из-за неизвестной проблемы AfterViewInit был вызван до определенного изменения.Я включил код для определения темы поведения, и теперь все работает хорошо.

...