Подписка 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]
в каждом компоненте он должен быть только в верхнем корневом компоненте.
Надеюсь, это кому-нибудь поможет.
Если вы собираетесь делиться вещами между компонентами.
- Вы должны использовать этот apiService в модуле высокого уровня. нравиться:
providers: [ApiService]
. - Вы должны быть в компоненте, чтобы поймать подписку 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;
}
Итак, чтобы уточнить: в консоли не было сообщений об ошибках при сбое индекса массива.