Angular(版本 8)- 订阅未触发

Angular (version 8) - Subscribe not firing

我正在尝试通过使用可观察对象和 Subject 在组件之间建立通信。

这是我的服务。

公共服务

  private style = new Subject<string>();

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

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

我尝试使用 getStyle() 方法订阅的组件在构造函数中包含以下代码。

底部栏

    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');

我已将代码简化到最低限度,但它仍然没有触发 subcribe() 函数。

----> Stackblitz

解决方法和注意事项

为了在组件之间建立通信,上述技术非常有效。错误是因为 app-bottom-bar 是用 ngIf* 实现的,没有调用构造函数*,因此没有调用订阅函数。

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

你能改变吗

private style = new BehaviorSubject <string>();

底部栏可能会在侧边栏之前呈现,从而导致订阅丢失。 BehaviorSubject 将使最后的订阅对所有组件可用。

谢谢

Subject 不会为新订阅者重播旧值。因此,如果您在订阅发生之前调用了 updateStyleArray(),它将不会触发,直到对 updateStyleArray() 进行新的调用。

要解决此问题,您可以将 Subject 替换为 ReplaySubject 并将缓冲区大小设置为 1:

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

现在,如果您在调用 style.next() 之后订阅,您的样式可观察对象将缓冲最后一个值并发出该值。

BottomBarComponent 构造函数未被调用。因此,您实际上还没有订阅。

Fix - 将其粘贴到 app.component.html

<app-bottom-bar></app-bottom-bar>