2016-09-12 6 views
1

私はangle2を使ってparamに基づいてapi呼び出しをしようとしています。コンポーネントが初期化され、パラメータが変更されたときに、このapi呼び出しを行う必要があります。以下は私が使用しているコードです。問題は、ngOnInitが実行されて、paramsでapiを呼び出した後、すぐにapiを2回呼び出す変更をサブスクライブするときです。initとparamsでのapi呼び出しの変更

このような状況を処理する適切な方法は何ですか。これにより、api呼び出しはinitで一度だけ呼び出され、それでもパラメータの変更を観察できますか?

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

subscribe()関数内で2つのget()呼び出しを最初から防ぐ「init-flag」の設定はどうですか? – fen89

答えて

0

それはあなたの観測を組み合わせることObservable.combineLatestを使用することができ、これは、すべての変更にトリガすることが判明しました。このようなものはうまく動作します:

ngOnInit() { 
    this.sub = Observable.combineLatest(this.route.queryParams, this.route.params).subscribe((params: any) => { 
     this.queryParams = params[0]; 
     this.params = params[1]; 
     this.get(); 
    }); 
    } 
1

は(subscribeへの呼び出しなし)ngOnInit十分ではないのですか?あなたはすでにzipで変更を購読しています。なぜあなたは再び入社しますか?それとも明白な何かが恋しい?

ngOnInit() { 
    Observable.zip(this.route.queryParams, this.route.params).subscribe((params: any) => { 
    this.queryParams = params[0]; 
    this.params = params[1]; 
    this.get(); 
    }); 
} 
+0

いいえ、残念ながらzipは一度しか呼び出されません。 – Mike

関連する問題