2017-04-20 80 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(); 
    } 
}