2017-04-20 44 views
3

我正在學習Angular 2和Typescript。我正在構建一個簡單的Web應用程序,它從Web API抓取數據並將其顯示在列表中。然後,一旦用戶點擊列表中的一個項目,它們將被帶到詳細信息頁面。如何修改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. 如果是,應該做些什麼,或者有更好的方法來完成我想要做的事情?

感謝

+0

這不是'angularjs'。已經有一個「地圖」,是什麼阻止你添加另一個?運營商正是爲此而存在的。 – estus

+0

對不起,這是Stack Overflow建議的標籤。 – user961714

回答

1

你可以在你的GetData的代碼的處理過程中,map內:

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並將數據發送回 - 將它們收集回數組

使用flatMap運算符是因爲Observable運算符總是發回Observable,但由於我們在結果本身內部創建了Observable它產生一個Observable>,flatMap移除一個Observable l艾爾。希望這可以幫助

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(); 
    } 
}