Обратный вызов подписки на угловую службу не вызывается в компоненте библиотеки

#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. Большое спасибо за ваши усилия, чтобы привести пример и ответить на него. Я решил эту проблему на самом деле по-другому. Вместо импорта полного пути к компоненту библиотеки я импортировал только имя модуля . Это Сработало!