Angular 将管道()链内的两个可观察对象合并
我使用的是Rxjs,我想从以下模式(按顺序)创建一个可观察的对象:Angular 将管道()链内的两个可观察对象合并,angular,observable,rxjs6,rxjs-observables,combinelatest,Angular,Observable,Rxjs6,Rxjs Observables,Combinelatest,我使用的是Rxjs,我想从以下模式(按顺序)创建一个可观察的对象: 从paramMap$获取参数,然后 基于params的值,将两者(getData():Observable,getCategories():Observable)一起获取,然后 从([数据,类别])创建最终对象 代码如下所示: //route = this.ActivatedRoute let obs$ = route.paramMap.pipe( // combineLatest() is not a pipable
//route = this.ActivatedRoute
let obs$ = route.paramMap.pipe(
// combineLatest() is not a pipable operator, so it shouldn't be used inside .pipe()
// also it doesn't accept a function,
// but this just to show you what I want to do.
combineLatest(params=>getData(params.id), params=>getCategories(params.id)),
map(([data, categories])=>{
//do some changes...
return {data,categories}
}
)
)
另外,在Angular project中放置此代码的最佳位置是:
不是最佳实践,因为这是一个长期运行的操作(实际上它必须执行API请求)constructor()
- 不建议使用
,因为在某些情况下,我必须更改模板中使用的ngOnInit()
此.params
<div>{{params.type}}</div>
{{params.type}
对于获取参数后可观察的管道,可以使用开关映射
并从其中返回一个forkJoin()
this.route.paramMap.pipe(switchMap((params) => {
return forkJoin(getData(params.id), getCategories(params.id));
}));
我认为,订阅一个可观察的、执行API请求的,理想情况下都应该转到ngOnInit()
,除非您有一些非常具体的要求,在加载组件时您不需要这些订阅
就
this.params
而言,您可以使用管道tap()
或订阅此可观察对象的位置在下分配this.params
。对于获取参数后管道化可观察对象,您可以使用开关映射
并从其中返回forkJoin()
this.route.paramMap.pipe(switchMap((params) => {
return forkJoin(getData(params.id), getCategories(params.id));
}));
我认为,订阅一个可观察的、执行API请求的,理想情况下都应该转到ngOnInit()
,除非您有一些非常具体的要求,在加载组件时您不需要这些订阅
就
this.params
而言,您可以使用管道tap()
或在订阅此可观察对象的位置下分配this.params
。我没有回答您问题的第二部分。>因为在某些情况下,我应该更改模板中使用的this.params which,这对在ngOnInit()
中执行此过程有何影响检查完成后无法更改模板中使用的值,因此将此代码移动到ngOnInit
不是最佳做法@Ashish RanjanI不相信会对ngOnInit()
进行检查,此时甚至视图都没有创建。我没有回答您问题的第二部分。>因为在某些情况下,我应该更改模板中使用的this.params which,这对在ngOnInit()
中执行此过程有何影响检查完成后无法更改模板中使用的值,因此将此代码移动到ngOnInit
不是最佳做法@Ashish RanjanI认为不会对ngOnInit()
进行检查,此时甚至视图也不会创建。