Совместное использование службы данных между компонентами - PullRequest
0 голосов
/ 25 июня 2019

Я новичок в Angular и у меня проблема. У меня есть два компонента A и B. И SharedDataService. В компоненте A я получаю данные из службы REST и для обмена этими данными с компонентом B я хочу использовать SharedDataService.

Компонент А:

let data: Data;
this.restService.getData().subscribe(data => 
          {
            this.sharedService.addSharedData(data);
          } , error => console.error(error));

Компонент B:

let sharedData: Data;
     this.SharedService.getSharedData()
     .subscribe(ds => sharedData = ds);

И SharedService:

public sharedData: Data;

  constructor() { }

  addSharedData(data : Data) {
    this.sharedData = data;
  }

  getSharedData() : Observable<Data> {
    return of (this.sharedData);
  }

Во время отладки я обнаружил, что Компонент B пытается получить данные в несколько раз раньше, чем Компонент A поместил туда что-то. Как это устроено? Я думал, что подписка всегда извлекает данные, если они изменились. Но почему сейчас это не работает?

P.S. Обмен данными работает хорошо. Например, это работает, если я поставлю this.sharedService.addSharedData (fakedata); до подписки restService в Компоненте A

1 Ответ

2 голосов
/ 25 июня 2019

измените ваш SharedService, чтобы использовать BehaviorSubject и мощность реактивного программирования.

  private sharedData: BehaviorSubject<Data> = new BehaviorSubject<Data>(null);

  addSharedData(data: Data) {
    this.sharedData.next(data);
  }

  getSharedData(): Observable<Data> {
    return this.sharedData.asObservable();
  }

таким образом SharedService будет беспрепятственно отслеживать ваши данные и уведомлять все подписки getSharedData() при каждом новомзначение приходит с addSharedData(data: Data)

, также с использованием BehaviorSubject вместо Subject. Любые новые подписки будут получать последние предыдущие данные.Но имейте в виду, что пока некоторые данные не поступят с addSharedData, метод getSharedData будет давать нулевое значение.

...