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 に答える
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 に答える