【发布时间】:2017-04-21 10:14:31
【问题描述】:
我有三个组件,每个组件都有自己的解析器,可以从不同的 API 获取数据。 为此,这些组件依赖于一个 url,该 url 使用服务在它们之间共享。
我希望当该 url 发生更改时,每个组件都会自行重新加载,即重新启动解析器。
我查看了几个相关的 S.O 问题,但没有提到在使用解析器时如何这样做,参见: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)')
【问题讨论】:
-
@estus 添加了详细的 plunkr。链接演示了我已经在使用的 ActivatedRouteSnapshot 的使用。
-
好的,我明白了。应该刷新解析器的重定向应该发生在哪里?
-
@estus 更新了 plunk。这是我正在做的事情的简化版本,但你应该明白。
-
是同一个子路由,所以路由组件没有更新,解析器也不会再次运行。如果它不同(相同的路由但不同的参数),则不会更新路由组件,但解析器将运行,并且可以订阅
ActivatedRoutedataobservable。这里的问题是错误地选择了责任点。在这里使用解析器是没有意义的,因为它们无论如何都引用共享服务。直接使用共享服务即可。共享服务中的 RxJS 主题有助于使 url 更改可订阅。
标签: angular typescript angular2-routing