Angular2: метод подписки не запускается при вызове из другого компонента

Я пытаюсь обновить данные из одного компонента, и получить его в другой компонент петь Subject а также Observables,

проблема

Я могу хранить данные в datShareService, но мой getData никогда не вызывается после обновления данных.

У меня следующая структура кода

fileComponent.ts пытается сохранить некоторые данные в dataShareService

{
...
//call dataShareService and update data
this.dataShareService.updateData(this.things);
...
}

dataShareService.ts будет получать данные и возвращать их по запросу

{
...
private outputs = new Subject<any>();

  constructor() { }


  getData(): Observable<any>{
    console.log('getData', this.outputs.asObservable());
    return this.outputs.asObservable();
  }

  updateData(outputs:any): void{
    this.outputs.next(outputs);
    console.log('datashare', this.outputs);
  }
...
}

resultsComponents.ts который подписался на getData метод

{
...
public results : any;
  private sub : Subscription;

  constructor(private dataShareService: DatashareService) {
    console.log(this.dataShareService);
  }

  ngOnInit() {
    this.sub = this.dataShareService.getData().subscribe(output => {
      this.results = output;
    });
    console.log('visual result arrived', this.results);
  }
...
}

Я почти уверен, что проблема в последовательности этих методов, но не знаю, где именно.

3 ответа

Если вы не получаете никакой ценности, то вы должны изменить свои dataShareService.ts следующим образом

 {
   ...
   private outputs = new Subject<any>();

   constructor() { }


   getData(): Observable<any>{
    console.log('getData', this.outputs.asObservable());
    return this.outputs.asObservable();
   }

    updateData(outputs:any): void{
    this.outputs.next({text:outputs});
    console.log('datashare', this.outputs);
   }
   ...
  }

Используйте ReplaySubject вместо Subject, чтобы он также выдавал предыдущие значения

Вы положили console.log('visual result arrived', this.results); вне вашего метода подписки.

Положить ваши console.log('visual result arrived', this.results); внутри метода подписки, когда данные обновляются, они выводятся на консоль.

Ниже

Рабочий пример

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