Angular2 + RxJS BehaviorSubject订阅不适用于所有组件

时间:2016-09-14 19:53:07

标签: angular rxjs angular2-services behaviorsubject

我正在尝试在我的组件之间进行某种通信,所以我在这样的组件中使用带有BehaviorSubject和Subscription的服务:

服务(与问题相关的代码):

this._api.updateClientModalAction(id)

组件A:

import { Subscription } from 'rxjs/subscription'

private _subscription: Subscription
ngOnInit() { this._subscription = this._api.modalAction$.subscribe(res => {
   this.refreshModal(res)
   console.log('received')
})}

组件B:

<router-outlet>

如果组件B是组件A的子组件,这是完美的工作,但如果A是根组件而B在其sent内(或相反),则没有收到任何订阅,我只得到{控制台中的{1}}。

我做错了什么?

4 个答案:

答案 0 :(得分:21)

问题比我想象的要简单,我没有在更高级别上使用该服务,我不应该在每个组件中使用providers: [ApiService],而应该只在更高的根组件上

我希望这会对某人有所帮助。

https://github.com/angular/angular/issues/11618#event-790191142

答案 1 :(得分:0)

如果要在组件之间共享内容。

  1. 您应该在高级模块中使用该apiService。喜欢 : providers: [ApiService]
  2. 您应该必须在组件中才能捕获组件中rxjs的订阅。

答案 2 :(得分:0)

除了必须使用的答案

@Injectable({
providedIn: 'root'})

以便在根目录上加载服务。

答案 3 :(得分:0)

在我的例子中订阅没有发生是因为内部函数中的一个无提示错误:

  ngOnInit(): void {
    this.infoService.entries.asObservable().subscribe(
      entries => {
        this.entryBody = entries[0].body;
      });
  }

当我用支票包裹这一行时,它就开始工作了:

if (entries.length > 0) {
  this.entryBody = entries[0].body;
}

澄清一下:控制台中没有关于数组索引失败的错误消息。