Ich habe einen Datendienst, der Abfragen über HTTP (ausgelöst durch eine Komponente) ausführt und dann die Ergebnisse über Observable
darstellt. Andere Komponenten würden das Observable
abonnieren und ihre Ansicht der Ergebnisse aktualisieren.RxJS/Angular2: Warum wird mein Betreff-Abonnent nicht aufgerufen?
Das ist die Idee, aber es funktioniert nicht. Hier ist mein Code.
ItemListDataService:
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable, Subject } from "rxjs";
import 'rxjs/add/operator/map';
@Injectable()
export class ItemListDataService {
private issues$: Subject<any>;
constructor(private http: Http) {
this.issues$ = new Subject();
this.issues$.subscribe(x => console.log('GOT IT', x));
}
getList(): Observable<any> {
return this.issues$;
}
refresh() {
this.http.get('/whatever')
.map((response: Response) => response.json())
.subscribe(data => this.issues$.next(data));
}
}
ItemListComponent:
import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { ItemListDataService } from './item-list-data-service';
@Component({
selector: 'app-item-list',
templateUrl: './item-list.component.html',
styleUrls: ['./item-list.component.css'],
providers: [ItemListDataService]
})
export class ItemListComponent {
data: any;
constructor(itemListDataService: ItemListDataService) {
itemListDataService.getList().subscribe(data => {
console.log('DATA CHANGED');
this.data = data;
}, err => {
console.log('ERR', err)
},() => {
console.log('DONE');
});
}
}
Der Teilnehmer in ItemListDataService.constructor
erstellt wird jedes Mal aufgerufen, die refresh()
genannt wird. Die einzige Sache, die nicht funktioniert, ist das Abonnement in der Komponente - keiner Rückruf wird dort jemals aufgerufen.
Was mache ich falsch?
Woo Anrufe aktualisieren()? Woher erhält es den ItemListDataService? Sie haben ItemListDataService den Anbietern von ItemListComponent hinzugefügt, sodass die Komponente (und ihre Unterkomponenten) eine eigene Serviceinstanz erhält, die sich von den anderen Komponenten unterscheidet. –
@JBNizet Danke, nach einigen Recherchen kam ich zum selben Schluss. Tatsächlich bestand das Problem darin, dass jede Komponente ihre eigene Instanz des Dienstes erhielt. Von Angular 1 (und zahlreichen anderen DI-Gerüsten) kommend erwartete ich, dass es sich um Singletons handelte. Lebe und lerne. :-) Fühlen Sie sich frei, das als Antwort zu posten. –