如何在Angular中循环观察值4
问题描述:
我有一个部分数组,我试图获取并显示每个部分下的所有项目。这似乎是一个非常简单的要求。这里是我的代码:如何在Angular中循环观察值4
//my ngOnInit call this function
this.sectionService.GetItemList(this.selectedSectionList, this.culture)
.subscribe(
(itemList: ItemBySection[]) => {
this.itemBySection = itemList;
this.loaded = true;
},
(error: any) => this.errorMessage = error,() =>
console.log("loaded")
);
//this is my function in my service
public GetItemList(SectionItems: Sections[], strCulture): Observable<ItemBySection[]> {
let resultObservable
for (var SectionItem in SectionItems) {
let url = environment.portalWebServiceURL + "api/section/" + SectionItems[SectionItem].sectionItemID.toString() + "/" + strCulture;
resultObservable = this.http.get(url)
.catch(this.handleError)
.mergeMap(res => <ItemBySection[]>res.json());
}
return resultObservable;
}
也许我上面的解释是不是太清楚 那么我现在要做的是调用一个循环中我的web服务的多个时间和结果连接成一个列表。也许这会有所帮助。
for all my sectionIDs {
call url web service with sectionID
receive results from server
add the results in my item array
}
finally display all items.
我希望这可以帮到你。
答
可能问题在于你的http流:res.json()返回解析为json的响应正文。 所以你应该使用.map()运算符,而不是.mergeMap()运算符。
前者只是将转换函数应用于每个流数据并对结果进行流水处理(这就是您需要的),后者将一个observable的所有值投影到流中(而这不是您需要的)。
一些参考:
- flatMap(即mergeMap的别名):https://xgrommx.github.io/rx-book/content/observable/observable_instance_methods/flatmap.html
- 地图:https://xgrommx.github.io/rx-book/content/observable/observable_instance_methods/map.html
希望它能帮助:)
**更新* *
好的,我误解了你的需求:你需要d在一系列响应中加入所有http响应。 你可以做这样的事情:
public GetItemList(SectionItems: Sections[], strCulture): Observable<ItemBySection[]> {
const resultObservables = []
for (var SectionItem in SectionItems) {
let url = environment.portalWebServiceURL + "api/section/" + SectionItems[SectionItem].sectionItemID.toString() + "/" + strCulture;
const response = this.http.get(url)
.catch(this.handleError)
.map(res => <ItemBySection>res.json());
resultObservables.push(response)
}
return Observable.forkJoin(resultObservables);
}
我写了这个代码直接在这里,所以它可能不会工作,但它背后的想法应该是你所需要的:)
如果我使用映射系统只从第一部分拿起项目,但是如果我使用mergeMap,我得到这个错误“无法找到'object'类型的不同支持对象'[object Object]',NgFor只支持绑定到Iterables,比如数组。我只想显示所有选定部分的所有项目。那有意义吗?我如何将从Web服务接收到的所有记录合并或连接成1个可观察对象? –
好吧,现在我不明白你的需求,但你的代码做了一些dirrefent:你正在覆盖resultObservable变量的SectionItems的每个循环。 我尝试相应地更新我的答案:) –
非常感谢洛伦佐。你的回答将每次调用分隔成数组。我只需要弄清楚如何连接这些数组。我想我应该能够弄清楚。再次感谢。 –