我正在尝试使用angular2基于params进行api调用。我需要在组件初始化和params更改时进行此api调用。以下是我正在使用的代码。问题是当ngOnInit
运行时,它用params调用api,然后立即订阅更多次调用api的更改。
处理这种情况的正确方法是什么,以便api调用仅在init上调用一次,同时仍能观察到对params的更改?
ngOnInit() {
Observable.zip(this.route.queryParams, this.route.params).subscribe((params: any) => {
this.queryParams = params[0];
this.params = params[1];
this.get();
this.subscribe();
});
}
subscribe() {
this.queryParamsSub = this.route.queryParams.subscribe((params: any) => {
this.queryParams = params;
this.get();
});
this.paramsSub = this.route.params.subscribe((params: any) => {
this.params = params;
this.get();
});
}
// this is called 3 times on init
get() {
this.apiManager.get(this.queryParams, this.params);
}
ngOnDestroy() {
this.queryParamsSub.unsubscribe();
this.paramsSub.unsubscribe();
}
答案 0 :(得分:1)
不够ngOnInit
(没有调用subscribe
)?您已使用zip
订阅了更改。你为什么要再次重新订阅?或者我错过了一些明显的东西?
ngOnInit() {
Observable.zip(this.route.queryParams, this.route.params).subscribe((params: any) => {
this.queryParams = params[0];
this.params = params[1];
this.get();
});
}
答案 1 :(得分:0)
事实证明,您可以使用LATERAL
来组合可观察对象,这将在每次更改时触发。像这样的东西效果很好:
Observable.combineLatest