【发布时间】:2017-09-24 19:48:09
【问题描述】:
我对 Angular 场景还很陌生,我开始因一些意想不到的行为而烦恼。
我的集成服务中有以下代码
queryList(): Observable<ApiList[]> {
if(this.loadingApiList == true) {
return Observable.of(this.queryListResult);
}
this.loadingApiList = true;
return this._http
.get('samples/apiList.json').map( (response: Response) => <ApiList[]> response.json())
.do(data => {
this.queryListResult = data;
});
}
如何阻止在从路由加载页面时执行两次此调用?
一个组件调用此方法并在导航中构建一个列表,另一个组件也为以下方法调用相同的服务:
getApiName(IT_ID:number) {
console.log(this.queryListResult);
let obj = this.queryListResult.find(o => o.IT_ID == IT_ID);
if(obj) {
return obj.IT_Name;
}
return false;
}
这在我不使用路由时非常有效,但是当我使用路由时,getApiName 返回一个未定义的结果。
我也使用了 resolve 对象,这确实解决了问题,但随后对 json 文件进行了两次调用,这就是我使用的。
resolve(route: ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<any>{
return this._service.queryList() // We need this to finish first.
}
我现在真的被困住了——我可以使用 resolve 让它工作,但是对 .json 进行两次调用很浪费。
这样做的正确方法是什么?
【问题讨论】:
-
设置了flag并不一定意味着操作完成,查询列表结果已经赋值。实现此目的的一种方法是在基于主题的可观察对象上公开数据并触发一次提取,例如参见blog.jonrshar.pe/2017/Apr/09/async-angular-data.html 我展示了我们是如何使用这种模式的。