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);
внутри метода подписки, когда данные обновляются, они выводятся на консоль.
Ниже