4

我正在尝试在我的组件之间进行某种通信,因此我在组件中使用具有 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 在其内部<router-outlet>(或相反),则订阅没有收到任何内容,我只能进入sent控制台。

我究竟做错了什么?

4

4 回答 4

33

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

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

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

于 2016-09-15T05:41:18.233 回答
2

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

  1. 您应该必须在高级模块中使用该 apiService 。喜欢: providers: [ApiService]
  2. 您应该必须在组件中才能在组件中捕获 rxjs 的订阅。
于 2020-01-24T06:26:35.500 回答
0

除了你的答案,你必须使用

@Injectable({
providedIn: 'root'})

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

于 2020-08-28T13:42:56.580 回答
0

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

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

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

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

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

于 2021-07-24T17:52:51.860 回答