Angular 7 - проблема синхронизации NavigationEnd и OnDestroy - PullRequest
0 голосов
/ 11 декабря 2018

Мы только что обновили наш проект с Angular 6 до Angular 7 и заметили следующую проблему, когда событие NavigationEnd генерируется до уничтожения компонентов.До обновления до Angular 7 мы видели, как событие NavigationEnd генерировало после уничтожения компонентов.

Каждый экземпляр WidgetContainerComponent подписывается на конфигурацию, наблюдаемую в ngOnInit, и ngOnDestroy откажется от нее.

  constructor(@SkipSelf() private dataProviderDirective: DataProviderDirective) {
    super();
  }

  ngOnInit(): void {
    console.log("WidgetContainer.ngOnInit called");
    const _self = this;
    this.dataProviderDirective.getConfigurationPublisher().subscribe(widgetConfigurations => {
      _self.processConfiguration(widgetConfigurations, this.alias);
      this.subscribe(this.wsDataTopic + this.configuration.id, (message: Message) => this.onDataTopic(message));
      this.subscribe(this.wsStaleTopic + this.configuration.id, (message: Message) => this.onStaleTopic(message));
    });
  }

  ngOnDestroy(): void {
    console.log("WidgetContainer.ngOnDestroy() called");
  }

Другой компонент, в котором размещены эти компоненты (DashboardContainerComponent), имеет следующее:

  navigationSubscription;

  constructor(@Host() private dashboardComponent: DashboardComponent, private router:Router) {
    super();
    this.navigationSubscription = this.router.events.subscribe((e: any) => {
      // If it is a NavigationEnd event re-initalise the component
      if (e instanceof NavigationEnd) {
        console.log("DashboardContainerComponent.onNavigationEnd()");
        this.initialize();
      }
    });
  }

  ngAfterViewInit(): void {
    console.log("DashboardContainerComponent.ngAfterViewInit()");
    this.initialize();
  }

  ngOnDestroy(): void {
    if (this.navigationSubscription) {
      this.navigationSubscription.unsubscribe();
    }
  }

  private initialize(): void {
    this.publishConfiguration(this.dashboardComponent.getWidgets());
  }

Мы ожидаем увидеть, что при переходе от одной страницы панели инструментов к другой существующие WidgetContainerComponents на экране будут уничтожены.сначала запускается событие NavigationEnd, в результате чего контейнер перезагружает новые конфигурации виджетов с сервера.В то же время новые WidgetContainerComponents воссоздаются для новой страницы панели мониторинга и подписываются на событие конфигурации контейнеров.

Однако вместо этого мы видим, что пользователь переходит на новую панель мониторинга, выводится конец навигации иКонтейнер испускает новые конфигурации виджетов.Затем старые экземпляры контейнера виджетов + новые все пытаются обработать это событие, а старые контейнеры виджетов выдают ошибки, потому что данные, которые они ищут, не существуют (потому что они не являются частью этой страницы).

Мы не уверены, является ли это преднамеренным изменением времени этих событий жизненного цикла, но есть ли что-то, что мы можем сделать, чтобы предотвратить возникновение этой ситуации?

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