Angular2:如何刷新依赖于解析器的组件?

时间:2016-12-06 17:09:54

标签: angular typescript angular2-routing

我有三个组件,每个组件都有自己的解析器,可以从不同的API中获取数据。 为此,这些组件依赖于使用服务在它们之间共享的URL。

我希望当对该URL发生更改时,每个组件都会重新加载,即重新启动解析器。

我看了几个相关的S.O问题,但没有提到使用解析器时如何做,cf:question 1question 2question 3

我可以想到两种方式:

脏方法:使用路由器重定向和空白组件强制刷新组件。

this.router.navigateByUrl('blank',true);
this.router.navigateByUrl('home/(mapps:mobil//sw:simil//sf:sales)');

但那没用。有一个刷新,但解析器没有......解决。

另一种方式:使用BehaviorSubject或ChangeDetectorRef。 但是,我对如何实现它一无所知,考虑到检测到组件内的变化无法帮助我实际重启解析器。

我的感觉是,这必须通过路由器以某种方式完成,因为它是了解旋转变压器的人:

const routes: Routes = [
  {
    path: '',
    redirectTo: 'home',
    pathMatch: 'full'
  },
  {
    path: 'home',
    component: HomeComponent,
    children : [
      {
        path: '',
        component: BlankComponent
      },
      {
        path: 'simil',
        component: SwComponent,
        outlet: 'sw',
        resolve: {
          data: SwResolve
        }
      },
      {
        path: 'sales',
        component: SalesComponent,
        outlet: 'sf',
        resolve: {
          data: SalesResolve
        }
      }
    ]
  },
  {
    path: 'blank',
    component: BlankComponent
  }
];

有关如何实现这一目标的任何提示?

编辑:这是related plunkr

编辑6月17日: 不再需要空白组件解决方法。 要刷新组件,只需回调路线:

this.router.navigateByUrl('home/(mapps:mobil//sw:simil//sf:sales)')

2 个答案:

答案 0 :(得分:9)

目前无法刷新路线。可能会这样做with RouteReuseStrategy in Angular 2.3

当路线发生变化时,可以重新评估解析器,并且可以从ActivatedRoute观察。如果路线保持不变(没有改变参数),则不会重新评估它们,并且应该相应地进行设计。

路由更改是异步的,解决方法是链路路由更改:

this.router.navigateByUrl('blank').then(() => {
  this.router.navigateByUrl('home/(mapps:mobil//sw:simil//sf:sales)');
})

答案 1 :(得分:1)

角度为5或更高时,可以重新运行GuardsAndResolvers

来自official documentation

  

默认情况下,它们仅在路径的矩阵参数时运行   更改。当设置为paramsOrQueryParamsChange时,它们也将在何时运行   查询参数更改。当设置为always时,它们每次都会运行。

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

这应该重新运行警卫和解决方案。