Взаимодействие не связанных компонентов Angular 9

Есть компонент MainLayoutComponent в котором есть календарь. Календарь размещен в toolbar. Задача: при изменении даты в календаре перестроить таблицу, которая находится в TaskPageComponent. Как сделать? Сделал сервис TaskService в нем написал:

 private _mainRangeDates: Date[] = [
    moment().startOf('month').toDate(),
    moment().endOf('month').toDate()
  ];

  private dateSubject$ = new BehaviorSubject<Date[]>(this._mainRangeDates);
  mainRangeDatesChange$ = this.dateSubject$.asObservable();

  // Установить значение
  setMainRangeDates(date: Date[]) {
    this._mainRangeDates = date;
    this.dateSubject$.next(this._mainRangeDates);
  }

В MainLayoutComponent написал :

  onClickOutside(event: any) {
    if (!this.rangeDates[1]) {
      this.rangeDates = [
        this.rangeDates[0],
        this.rangeDates[0]
      ];
    }

    this.taskService.setMainRangeDates(this.rangeDates);
  }

В сервис данные передаються. Как теперь с сервиса перестроить таблицу в компоненте TaskPageComponent? Как с сервиса получить измененное значение, а не то что установлено по-умолчанию?


Ответы (1 шт):

Автор решения: Дмитрий

В сервисе делаем публичным BehaviorSubject

dateSubject$ = new BehaviorSubject<Date[]>(this._mainRangeDates);

В другом компоненте подписываемся на него

this.taskService.dateSubject$
  .pipe(takeUntil(this.unsubscribe$))
  .subscribe(dates => console.log(dates));

Обратите внимание на необходимость отписок

.pipe(takeUntil(this.unsubscribe$))

В компоненте есть приватная переменная

private unsubscribe$ = new Subject();

которая уничтожается в ngOnDestroy

ngOnDestroy(): void {
  this.unsubscribe$.next();
  this.unsubscribe$.complete();
}
→ Ссылка