2016-06-02 8 views
0

eine Dokumentation Verwendung fand ich online, ich habe für das Speichern einige Daten wie folgt ein Service-Methode geschrieben:Erfolg/Fehler von Service-Reporting mit Events/Observable

@Injectable 
export class BrandService { 

    brands$: Observable<Brand[]>; 
    private _brandsObserver: Observer<Brand[]>; 
    private _dataStore: { 
     brands: Brand[] 
    }; 

    constructor(private http: Http) { 
    this.brands$ = new Observable(observer => this._brandsObserver = observer).share(); 
    this._dataStore = { brands: []}; 
    } 

    saveBrand(brand: Brand) { 
    var headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    return this.http.post("http://localhost:8080/api/brands", JSON.stringify(brand), { headers: headers }) 
     .map((response: Response) => response.json()).subscribe(
      data => { 
      this._dataStore.brands.push(data); 
      this._brandsObserver.next(this._dataStore.brands); 
      }, 
      error => console.log("Could not create Brand")); 
    } 
} 

Was mir zu tun erlaubt ist Updates schieben zu meiner Sammlung von Marken und meine Tabelle in der Ansicht wird diese Änderungen beobachten und automatisch aktualisieren, so dass ich sie nicht manuell aktualisieren muss. Alles ist gut mit der Welt.

Mein Problem ist, dass, da ich die http.post im Service abonniere, meine Komponente jetzt keine Möglichkeit hat, zu wissen, ob dieser Aufruf erfolgreich war oder nicht, was auch bedeutet, dass ich das Formular in einem modalen Format zeige Dialog, ich weiß nicht, ob ich den Dialog schließen oder Fehler anzeigen soll. Meine Komponente einfach erledigt diese ...

this._brandService.saveBrand(this.brandForm.value); 

Also, ich dachte, dass ich ein einen Weg finden sollte) Feuer ein Ereignis in den Dienst, den ich in der Komponente hören bin für, wenn gut/schlecht Dinge passieren und handeln entsprechend, oder b) finde heraus, wie man einige andere Eigenschaften in dem Dienst beobachtet, auf die ich reagieren kann, wenn diese Änderungen erkannt werden. Aber ich bin ziemlich neu in all diesen beobachtbaren Sachen und ich weiß nicht wirklich wo ich anfangen soll.

data => { 
    this._dataStore.brands.push(data); 
    this._brandsObserver.next(this._dataStore.brands); 
    // fire some success event or 
    // update some observed property 
}, 
error => { 
    // fire some failure event or 
    // update some observed property 
} 

Antwort

1

Sie konnten die subscribe() bei Aufrufort tun

saveBrand(brand: Brand) { 
    var headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    return this.http.post("http://localhost:8080/api/brands", JSON.stringify(brand), { headers: headers }) 
     .map((response: Response) => response.json()).map(
      data => { 
      this._dataStore.brands.push(data); 
      this._brandsObserver.next(this._dataStore.brands); 
      }); 
    } 
this._brandService.saveBrand(this.brandForm.value) 
.subscribe(
    value => onSuccess(), 
    error => onError()); 

Wenn Sie noch in saveBrand Umgang mit etwas allgemeiner Fehler tun möchten, können Sie den catch Operator (wie in Intercepting errors and subscribing to verwendet)

+1

Heilige Kuh. So einfach. Ich wusste gar nicht, dass ich Karten in dieser Situation ketten könnte. Vielen Dank! – Gregg