Es gibt keine Notwendigkeit, die beobachtbare zurück von Http die Methode get() in ein Versprechen zu konvertieren. In den meisten Fällen kann der Dienst das Observable einfach zurückgeben.
Wenn wir eine Array oder einen primitiven Typ sind Abrufen (dh, string, Zahl, boolean) vom Server, können wir unsere Controller-Logik vereinfachen, indem die zurück beobachtbaren direkt in unserer Vorlage, mit den asyncPipe . Diese Pipe wird die Observable automatisch abonnieren (sie funktioniert auch mit einer Zusage) und gibt den neuesten Wert zurück, den die Observable ausgegeben hat. Wenn ein neuer Wert ausgegeben wird, markiert die Pipe die Komponente, die auf Änderungen geprüft werden soll. Daher wird die Ansicht automatisch mit dem neuen Wert aktualisiert.
Wenn wir ein Objekt vom Server holen,
Ich bin mir nicht bewusst irgendeine Weise asyncPipe zu verwenden,
wir das Asynchron-Rohr, in Verbindung mit dem sicheren Navigation Operator verwenden könnten wie folgt aussehen:
{{(objectData$ | async)?.name}}
Aber das sieht kompliziert aus, und wir müssten das für jede Objekteigenschaft wiederholen, die wir anzeigen wollten.
Stattdessen schlage ich subscribe()
auf die Observable in der Komponente und speichern Sie das enthaltene Objekt in einer Komponente Eigenschaft. Wir verwenden dann die safe navigation operator (?.) Oder (wie @Evan Plaice in einem Kommentar erwähnt) NgIf in der Vorlage. Wenn wir den sicheren Navigationsoperator oder NgIf nicht verwenden, wird ein Fehler ausgegeben, wenn die Vorlage zum ersten Mal versucht, zu rendern, da das Objekt noch nicht mit einem Wert gefüllt ist.
Beachten Sie, dass der folgende Service immer eine Observable für jede Get-Methode liefert.
service.ts
import {Injectable} from 'angular2/core';
import {Http} from 'angular2/http';
import 'rxjs/add/operator/map'; // we need to import this now
@Injectable()
export class MyService {
constructor(private _http:Http) {}
getArrayDataObservable() {
return this._http.get('./data/array.json')
.map(data => data.json());
}
getPrimitiveDataObservable() {
return this._http.get('./data/primitive.txt')
.map(data => data.text()); // note .text() here
}
getObjectDataObservable() {
return this._http.get('./data/object.json')
.map(data => data.json());
}
}
app.ts
import {Component} from 'angular2/core';
import {MyService} from './my-service.service';
import {HTTP_PROVIDERS} from 'angular2/http';
@Component({
selector: 'my-app',
providers: [HTTP_PROVIDERS, MyService],
template: `
<div>array data using '| async':
<div *ngFor="#item of arrayData$ | async">{{item}}</div>
</div>
<div>primitive data using '| async': {{primitiveData$ | async}}</div>
<div>object data using ?.: {{objectData?.name}}</div>
<div *ngIf="objectData">object data using NgIf: {{objectData.name}}</div>`
})
export class AppComponent {
constructor(private _myService:MyService) { console.clear(); }
ngOnInit() {
this.arrayData$ = this._myService.getArrayDataObservable();
this.primitiveData$ = this._myService.getPrimitiveDataObservable();
this._myService.getObjectDataObservable()
.subscribe(data => this.objectData = data);
}
}
Hinweis: I "beobachtbare" in den Dienst Methodennamen – zB setzen, getArrayDataObervable()
– nur hervorheben, dass das Verfahren eine beobachtbare zurückgibt . Normalerweise werden Sie nicht "Observable" in den Namen setzen.
Daten/array.json
[ 1,2,3 ]
Daten/primitiv.json
Greetings SO friends!
data/object.json
{ "name": "Mark" }
Output:
array data using '| async':
1
2
3
primitive data using '| async': Greetings SO friends!
object data using .?: Mark
object data using NgIf: Mark
Plunker
Ein Nachteil bei usin g Die async
Pipe ist, dass es keinen Mechanismus gibt, um Serverfehler in der Komponente zu behandeln. I answered another question, die erläutert, wie solche Fehler in der Komponente zu fangen, aber wir müssen immer subscribe()
in diesem Fall verwenden.
Sie können HTTP ** als Versprechen verwenden, indem Sie '.toPromise()' gefolgt von Ihrer Kette von '.then()' Aufrufen hinzufügen. Dennoch sind Observables der empfohlene Ansatz. –
@EvanPlaice Yeah Ich lese über sie und jetzt bin ich ein Fan von Observables :) –
Werfen Sie einen Blick auf diese http://StackOverflow.com/A/34758630/5043867 –