21

我正在研究它好几天,但到目前为止还没有找到任何解决方案。

我有一个解析器服务,它应该返回一个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。当我手动更改它时,它不会再次“解决”路线。

我完全理解为什么,我阅读了文档。

有没有人有解决方法?在这种情况下,这甚至可以订阅参数并返回 Observable 吗?

到目前为止,我尝试了这个,但它没有返回 Observable,所以它什么都不做:

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

谢谢 :) !

----------- 解决方案(感谢马克西姆斯): -----------

添加路由:

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

然后,无需订阅路由事件或任何东西!魔法 !

4

1 回答 1

44

您可以runGuardsAndResolvers用于路线。这是官方文档所说的:

... 定义何时运行守卫和解析器。默认情况下,它们仅在路由的矩阵参数更改时运行。当设置为 paramsOrQueryParamsChange 时,它​​们也会在查询参数更改时运行。当设置为始终时,它们将每次运行。

因此,在定义路线时,您可以像这样使用它:

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

这应该重新运行警卫和解析器。

于 2017-07-21T12:45:48.873 回答