【问题标题】:Angular2 + RxJS BehaviorSubject subscription not working on all componentsAngular2 + RxJS BehaviorSubject 订阅不适用于所有组件
【发布时间】:2017-01-22 17:48:59
【问题描述】:

我正在尝试在我的组件之间进行某种通信,因此我在组件中使用具有 BehaviorSubject 和 Subscription 的服务,如下所示:

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

import { BehaviorSubject } from 'rxjs/BehaviorSubject'

private _clientModalActionSource = new BehaviorSubject<string>('')
modalAction$ = this._clientModalActionSource.asObservable()
public updateClientModalAction(action) {
   this._clientModalActionSource.next(action)
   console.log('sent')
}

组件 A:

this._api.updateClientModalAction(id)

组件 B:

import { Subscription } from 'rxjs/subscription'

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

如果组件 B 是组件 A 的子组件,这将完美运行,但如果 A 是根组件且 B 在其 &lt;router-outlet&gt; 内(或相反),订阅不会收到任何内容,我只会得到 sent在控制台中。

我做错了什么?

【问题讨论】:

    标签: angular rxjs angular2-services behaviorsubject


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你,你拯救了我的一天
    • 非常感谢,兄弟!
    • 如果在服务中提到 @Injectable({providedIn: 'root'}) ,我们还需要这样做吗?请帮忙!
    【解决方案2】:

    如果你要在组件之间共享东西。

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

    【讨论】:

      【解决方案3】:

      除了你的答案你必须使用

      @Injectable({
      providedIn: 'root'})
      

      为了在根目录上加载服务。

      【讨论】:

        【解决方案4】:

        在我的情况下,由于内部函数中的静默错误,订阅没有发生:

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

        只要我用支票包裹这条线,它就开始工作了:

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

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

        【讨论】:

        • 如果条目未定义或为空,它将失败。检查将是 if (entrys && entries.length > 0)
        猜你喜欢
        • 1970-01-01
        • 2021-01-11
        • 2017-05-04
        • 2019-11-09
        • 2017-09-14
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        相关资源
        最近更新 更多