2017-04-20 5 views
3

私はAngular 2とTypescriptの学習に取り組んでいます。私は、WEB APIからデータを取得してリストに表示するシンプルなWebアプリケーションを構築しています。ユーザーがリスト内の項目をクリックすると、詳細ページに移動します。Observable in Angular 2のデータを変更するには?

私は、次の処理を行い、API呼び出しを行うために作成したサービスを持っている:

GetData() { 
     let data = this.http.get('http://server.name/api/GetData') 
        .map((res) => res.json()); 
     return data; 
    } 

次にコンポーネントで、私はこのようなデータをサブスクライブ:

 this.myService.GetData() 
     .subscribe((myService) => this.items = myService); 

http.getが返ってきたら、GetData()メソッドから戻る前にJSONオブジェクトの処理をしたいと思います。たとえば、IDという新しいプロパティを追加します。基本的に以下の擬似コードのようなもの:

for each(item in data) { 
    item.ID = newID(); //method for creating IDs 
} 
  1. はこれを行うことができるものですか?
  2. 「はい」の場合は、実行する必要がありますか、または私がやろうとしていることを達成するためのより良い方法がありますか?あなたがmap以内に、あなたのGetDataのコードで処理を行うことができます

おかげ

+0

これは 'angularjs'ではありません。すでに1つの 'マップ'がありますが、もう1つ追加するのを止めるのは何ですか?演算子はそれのために正確に存在します。 – estus

+0

申し訳ありませんが、スタックオーバーフローによって提案されたタグでした。 – user961714

答えて

1

:あなたが購読中のオブジェクトを受け取るとき

this.http 
    .get('http://server.name/api/GetData') 
    .map(result => { 
    const items = <any[]>result.json(); // could be SomeItem[] instead of any[] 
    items.foreach(item => item.ID = ...); 
    return items; 
    }); 

はその後、アイテムはIDが割り当てられている必要があります。ここで

はRxJs観測のドキュメントへの参照です:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-map

0

アイデアはにある: - 観測を作る、あなたのJSONが配列であるとして - だけ JSONを取得するには、結果をマップ - 結果 を取得しますそれぞれのデータに対して、idを変更してデータを送り返します。

observable演算子は常にObservableを返すので、flatMap演算子が使用されるため、結果自体の中にObservableが作成されるため、flatMap演算子が使用されますObservable>を生成し、flatMapはObservable lを取り除きますayer。これが役立つことを願っています

GetData():Observable<WhateverWithIDInside[]> { 
    let data = this.http.get('http://server.name/api/GetData') 
    .map((res) => res.json()) 
    .flatMap(dataArr => Observable.from(dataArr) 
     .map(data => {data.ID = newID(); return data) 
     .toArray(); 
    } 
} 
関連する問題