我有三个组件,每个组件都有自己的解析器,可以从不同的API中获取数据。 为此,这些组件依赖于使用服务在它们之间共享的URL。
我希望当对该URL发生更改时,每个组件都会重新加载,即重新启动解析器。
我看了几个相关的S.O问题,但没有提到使用解析器时如何做,cf:question 1,question 2,question 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)')
答案 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
默认情况下,它们仅在路径的矩阵参数时运行 更改。当设置为paramsOrQueryParamsChange时,它们也将在何时运行 查询参数更改。当设置为always时,它们每次都会运行。
{
path: 'some path',
runGuardsAndResolvers: 'paramsOrQueryParamsChange'
...
}
这应该重新运行警卫和解决方案。