Angular (версия 8) - подписка не ведется - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь установить sh связь между компонентами с помощью наблюдаемых и Тема .

Это мой сервис.

CommonService

  private style = new Subject<string>();

  getStyle(): Observable<any> {
    return this.style.asObservable();
  }

  updateStyleArray(styleToApply) {
    this.style.next(styleToApply);
  }

Компонент, в котором я пытаюсь подписаться методом getStyle (), имеет следующий код внутри конструктора.

BottomBar

    this.commonService.getStyle().subscribe(style => {
      console.log('I am firing in order not to be fired!!!');
    });

Компонент, в котором я вызываю метод next () , имеет следующий код.

Боковая панель

 this.commonService.updateStyleArray('This is the name of a style');

I упростили код до минимума, но он все еще не запускает функцию subcribe () .

----> Stackblitz

Решение и ПРИМЕЧАНИЕ

Вышеупомянутая техника работает как шарм, чтобы установить sh связь между компонентами. Ошибка была вызвана тем, что app-bottom-bar был реализован с ngIf*, а конструктор не был вызван *, поэтому функция подписки не была вызвана.

*<app-bottom-bar *ngIf="isBottomBarVisible"></app-bottom-bar>.

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Конструктор BottomBarComponent не вызывается. Следовательно, вы на самом деле не подписались.

Исправить - вставьте это в app.component.html

<app-bottom-bar></app-bottom-bar>
0 голосов
/ 24 февраля 2020

Subject не будет воспроизводить старые значения для новых подписчиков. Поэтому, если вы позвонили updateStyleArray() до того, как ваша подписка произойдет, она не сработает, пока не будет сделан новый вызов updateStyleArray().

Чтобы решить эту проблему, вы можете заменить Subject на ReplaySubject и установите размер буфера равным 1:

  private style = new ReplaySubject<string>(1);

Теперь ваша наблюдаемая стиль будет буферизовать последнее значение и также выдать это значение, если вы подпишетесь после вызова style.next().

0 голосов
/ 24 февраля 2020

Можете ли вы изменить

private style = new BehaviorSubject <string>();

Может случиться, что нижний план рендерится раньше боковой панели, что приведет к потере подписки. BehaviorSubject сделает последнюю подписку доступной для всех компонентов.

Спасибо

...