Попытка использовать уничтоженное представление: событие receiveChanges, хотя представление отключено - PullRequest
1 голос
/ 09 мая 2019

У меня есть компонент, который выполняет некоторые сервисные вызовы и получает обещания. После того, как обещания разрешены, я делаю обнаружение изменений. Но иногда обещания разрешаются, когда представление компонента уже уничтожено, например, закрытая вкладка пользователя (внутренняя вкладка нашего приложения). В этом случае я получаю ViewDestroyedError: Attempt to use a destroyed view: detectChanges. Несмотря на то, что я отключил представление о фазе уничтожения моего tab.component. У меня вопрос, что я здесь делаю не так?

Я попытался отсоединить представление от обнаружения изменений на фазе уничтожения, но безуспешно, обещание выполняется после фазы уничтожения, и по-прежнему вызывается DetectChanges. Я понимаю, что ngOnDestroy на самом деле не уничтожает класс и что код внутри него будет уничтожен на этапе сборки мусора.

вот пример кода из моего 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();
  }

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

1 Ответ

0 голосов
/ 09 мая 2019

Отключение от обнаружения изменений на ngOnDestroy не требуется и не поможет с этой ошибкой.Однако вы не можете позвонить detectChanges после того, как ngOnDestroy был вызван.С помощью наблюдаемых вы можете отписаться от наблюдаемого в ngOnDestroy.Отменить подписку на Promise невозможно, поэтому вместо этого вам нужно будет оставить флаг в своем компоненте.

export class MyComponent {

  private destroyed = false;

  ngOnDestroy() {
    this.destroyed = true;
  }

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...