Ich bin ziemlich neu in der Angular Szene und ich fange an, mir die Haare aus einem unerwarteten Verhalten zu ziehen.Angular - Observables in Diensten
Ich habe den folgenden Code in meinem IntegrationsService
queryList(): Observable<ApiList[]> {
if(this.loadingApiList == true) {
return Observable.of(this.queryListResult);
}
this.loadingApiList = true;
return this._http
.get('samples/apiList.json').map((response: Response) => <ApiList[]> response.json())
.do(data => {
this.queryListResult = data;
});
}
Wie ich diesen Anruf stoppen wird zweimal beim Laden der Seite von einer Route ausgeführt?
Eine Komponente diese Methode aufruft und erstellt eine Liste in der Navigation, ruft eine andere Komponente die gleiche Dienstleistung für die folgende Methode:
getApiName(IT_ID:number) {
console.log(this.queryListResult);
let obj = this.queryListResult.find(o => o.IT_ID == IT_ID);
if(obj) {
return obj.IT_Name;
}
return false;
}
Dies funktioniert perfekt, wenn ich nicht Routen bin mit aber wenn ich routes Der getApiName gibt ein undefiniertes Ergebnis zurück.
Ich habe das Problem-Objekt auch verwendet, und das hat das Problem gelöst, aber dann wurden zwei Aufrufe an die JSON-Datei gemacht, das ist, was ich verwendet habe.
resolve(route: ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<any>{
return this._service.queryList() // We need this to finish first.
}
Ich bin jetzt wirklich stecken - ich kann es bekommen arbeiten die Entschlossenheit verwenden, aber es ist verschwenderisch mit dem .json zwei Anrufe haben.
Was ist der richtige Weg, dies zu tun?
Das Setzen des Flags bedeutet nicht unbedingt, dass die Operation abgeschlossen ist und das Ergebnis der Abfrageliste zugewiesen wurde. Eine Methode, um dies zu erreichen, besteht darin, die Daten über eine beobachtbare Subjekt-basierte Datenmenge auszusetzen und einmal einen Abruf auszulösen, siehe z. https://blog.jonrshar.pe/2017/Apr/09/async-angular-data.html wo ich zeige, wie wir dieses Muster benutzt haben. – jonrsharpe