#angular #rxjs
Вопрос:
Я создал компонент вкладки в библиотеке, где этот компонент показывает вкладки, и мы можем изменить содержимое вкладок или заголовок на основе нажатия кнопки, которая включена в компонент приложения. Я создал службу в библиотеке для обработки этого и зарегистрировал обратный вызов подписки в компоненте libray. Но когда я когда-либо нажимаю кнопку, я отправляю данные субъекту поведения, но обратный вызов подписки не срабатывает в компоненте библиотеки.
ngOnInit(): void {
this.onTabChangeReceived();
}
onTabChangeReceived = () => {
this.caseSelection.onSelectedTab().subscribe(caseSelected => {
debugger
console.log('caseSelected =======', caseSelected);
});
}
Компонент приложения, в который я отправляю данные, выглядит следующим образом
onLockedButtonClicked(event: string) {
console.log('event is', event);
this.caseSelectionService.sendSelectedTab(event.toLowerCase().replace(' ', ''))
}
import {Injectable} from '@angular/core';
import {BehaviorSubject, Observable,} from 'rxjs';
@Injectable({providedIn: 'root'})
export class LaCasesSelectionService {
private subject = new BehaviorSubject<string>('all cases');
sendSelectedTab(message: string) {
debugger
this.subject.next(message);
}
onSelectedTab(): Observable<string> {
return this.subject.asObservable();
}
}
Может ли кто-нибудь, пожалуйста, предположить, почему этот обратный вызов не срабатывает
Комментарии:
1. Есть ли какие-либо различия, когда вы создаете подобную функцию
onTabChangeReceived() {
вместо этогоonTabChangeReceived = () => {
?
Ответ №1:
Я создал stackblitz с приведенным выше кодом, и, похоже, он работает на меня. (Я получаю сообщения журнала.)
Вот стекблитц: https://stackblitz.com/edit/angular-communication-deborahk
Пожалуйста, проверьте это и посмотрите, есть ли что-то отличное от того, что вы делаете.
Одна вещь, которую следует проверить: регистрируете ли вы услугу несколько раз?
Например, вы правильно зарегистрировали услугу здесь:
@Injectable({providedIn: 'root'})
export class LaCasesSelectionService {
Вы также регистрируете службу, используя [providers]
массив в модуле или компоненте? Если это так, удалите его.
ПРАВКА: И дополнительная заметка:
event.toLowerCase().replace(' ', '')
// Or to replace all occurrences
// Use replaceAll if available, otherwise
// event.toLowerCase().replace(new RegExp(' ', 'g'), '')
Комментарии:
1. Большое спасибо за ваши усилия, чтобы привести пример и ответить на него. Я решил эту проблему на самом деле по-другому. Вместо импорта полного пути к компоненту библиотеки я импортировал только имя модуля . Это Сработало!