api调用init和params更改

时间:2016-09-12 04:29:14

标签: javascript angularjs angular rxjs

我正在尝试使用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();
}

2 个答案:

答案 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