Подписка Angular2 + RxJS BehaviorSubject работает не на все компоненты

Я пытаюсь установить какую-то связь между моими компонентами, поэтому я использую сервис с 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')
}

Компонент А:

this._api.updateClientModalAction(id)

Компонент Б:

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 ответа

Решение

Ну, проблема была проще, чем я думал, я не использовал сервис на более высоком уровне, я не должен был использовать providers: [ApiService] в каждом компоненте он должен быть только в верхнем корневом компоненте.

Надеюсь, это кому-нибудь поможет.

https://github.com/angular/angular/issues/11618

Если вы собираетесь делиться вещами между компонентами.

  1. Вы должны использовать этот apiService в модуле высокого уровня. нравиться:providers: [ApiService].
  2. Вы должны быть в компоненте, чтобы поймать подписку rxjs в компоненте.

Помимо вашего ответа вы должны использовать

@Injectable({
providedIn: 'root'})

чтобы загрузить службу в корень.

В моем случае подписка не произошла из-за тихой ошибки во внутренней функции:

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

Как только я обернул эту строчку чеком, она заработала:

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

Итак, чтобы уточнить: в консоли не было сообщений об ошибках при сбое индекса массива.

Другие вопросы по тегам