web-dev-qa-db-ja.com

queryParamsが変更されたときにリゾルバーを再実行する方法

何日も取り組んでいますが、今のところ解決策は見つかりません。

Observableを返すことになっているリゾルバーサービスがあります。

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<any>|Promise<any>{
    return Observable.forkJoin(
         this.http.get(first call with queryParam),
         this.http.get(second call with queryParam),             
    );
}

コンポーネントのActivatedRouteデータをサブスクライブしましたが、それはかなりうまく機能しています。

しかし、上のコードからわかるように、私のコンポーネントにはqueryParamがあり、API呼び出しはこれに依存していますqueryParam。手動で変更すると、ルートが再度「解決」されません。

理由を完全に理解し、ドキュメントを読みました。

誰かが回避策を持っていますか?この状況でparamsをサブスクライブしてObservableを返すことも可能ですか?

私はこれをこれまで試しましたが、Observableを返さないので何もしません:

this.router.events.subscribe(event => { 
    if(event instanceof ResolveEnd){
      // My previous Observable.forkJoin
    }
});

ありがとうございました :) !

-----------SOLUTION(thanks Maximus):-----------

ルーティングに追加:

{
   path: 'some path',
   runGuardsAndResolvers: 'paramsOrQueryParamsChange'
   ...
}

そうすれば、ルートイベントなどに登録する必要はありません。マジック !

17
KCarnaille

ルートにはrunGuardsAndResolversを使用できます。公式ドキュメントの内容は次のとおりです。

...ガードとリゾルバがいつ実行されるかを定義します。デフォルトでは、ルートのマトリックスパラメーターが変更されたときにのみ実行されます。 paramsOrQueryParamsChangeに設定すると、クエリパラメータが変更されたときにも実行されます。そして、常に設定すると、毎回実行されます。

したがって、ルートを定義するときは、次のように使用できます。

{
   path: 'some path',
   runGuardsAndResolvers: 'paramsOrQueryParamsChange'
   ...
}

これにより、ガードとリゾルバが再実行されます。

30
Maxim Koretskyi