2017-02-20 3 views
0

Observables、Promises、Angular 2、Javascriptではかなり新しいです。マッピングされたextractDataヘルパーでマップされたobservableにパラメータを渡す

getItemTransactions (item: Item): Observable<any> { 
    // Do some stuff ... 

    return this.http.post(this.url, body, options) 
        .map(this.extractData) 
        .catch(this.handleError); 
    } 

私の質問はどのように、ここでオブジェクト私は「アイテム」への参照を取得しますでしょうか?

private extractData(res: Response) { 
    let json = res.json().body 

    /// How do I assign back to item object here? 
    item.some_property = json["some_property"] 
    } 

コードはここから来る: https://angular.io/docs/ts/latest/guide/server-communication.html#!#extract-data

答えて

1
  1. 地図は別の型にタイプを変換するために使用する必要があります。 httpサービスを使用するときは、予想されるjson結果を、予想される既知の型に変換する必要があります。これは応答で.json()メソッドを使用して行うことができます。
  2. subscribeを使用して、.json()から期待される結果を得ます。

アクションのすべては、式の本体で実行できます。それらのアクションは別々のメソッドは必要ありません。これは好みのものなので、あなたが選んだものはどれもいいです。

以下のコードを参照してください。

getItemTransactions (item: Item): Observable<any> { 
// Do some stuff ... 

    return this.http.post(this.url, body, options) 
       .map((res) => res.json()) // get the data from the json result. This is equivalent to writing {return res.json()} 
       .subscribe((data) => { 
        this.doSomethingWithData(data, item); // pass that deserialized json result to something or do something with it in your expression 
       }) 
       .catch(this.handleError); 
} 

private doSomethingWithData(data: any, item: Item) { 
    // Do some stuff ... 

    item.some_property = data["some_property"]; 
} 
1

はなぜあなたが最初の場所でのメソッドのパラメータを再割り当てたいでしょうか?代わりに、代わりにクラスプロパティ(this.item vs item)を割り当てることをお勧めします。

しかし、あなたが本当にitemのparamを再割り当てしたい何らかの理由であれば、あなたは常にextractDataヘルパーをインラインでき、すなわち:

getItemTransactions(item: Item): Observable<any> { 
    return this.http.post(this.url, body, options) 
       .map((res: Response) => { 
        item = res.json(); // Re-assign some value to `item` 
       }) 
       .catch(this.handleError); 
} 

それはあなたがやりたいことはおそらくありません。通常のパターンは、関数にobservableを返すことです。subscribe()は、あなたのコードのどこかにその観測値に戻ります。サブスクライブコールバックの中で、割当を行うことができます。

これは、次のコードに変換します:

getItemTransactions(item: Item): Observable<any> { 
    return this.http.post(this.url, body, options) 
       .map((res: Response) => res.json()) 
       .catch(this.handleError); 
} 

// Somewhere else in your code 
this.getItemTransactions(item: Item).subscribe(data => { 
    item = data; // for instance 
} 
関連する問題