我有一个Aurelia应用程序,父路由器和子路由器。父:
{ name: 'group', route: 'group/:groupId', viewPorts: {
Filter: { moduleId: 'filter.js'},
Content: { moduleId: 'content.js' }
}}
设置子路由器:
[
{ name: 'home', route: '' },
{ name: 'documents', route: 'documents' },
{ name: 'images', route: 'images' },
{ name: 'specs', route: 'specs' }
]
子路由器在content.js
中配置。我想实现,在父路由器中,我在没有指定子路径完整路径的情况下导航
router.navigateToRoute('group', { groupId: 12345 });
在子路由器中,这将最终在home
,我将根据某些应用状态执行动态重定向。应该如何实现?到目前为止,我已尝试过这些
使用RedirectToRoute
:
activate(params: any, config: any, instruction: NavigationInstruction): any {
return new RedirectToRoute('pick one child route');
}
注入Router
:
@inject(Router)
export class Home {
constructor(router: Router) {
this.router = router;
}
activate(params: any, config: any, instruction: NavigationInstruction): void {
this.router.navigateToRoute('pick one child route');
}
}
重定向/导航本身正确本地,但是(子)路由器的baseUrl
仍然指向旧(父)路由,因此结果将不正确。
例如:我们位于:group/98765/images
的页面上,在父路由器中,我们导航:router.navigateToRoute('group', { groupId: 12345 });
。正如预期的那样,我们将以group/12345
和home
activate
方法结束。
我们在这里重定向,让我们对specs
说。但由于过时group/12345/specs
,我们将group/98765/specs
代替baseUrl
。
应该如何解决?
我已经看到儿童路由器baseUrl
的一些相关问题,建议在导航之前手动修复到常量。但是,由于模板化路由(比本例中显示的更复杂),这并不像将baseUrl
设置为常量字符串那么容易。
答案 0 :(得分:0)
虽然路由器事件可以工作,但它并不优雅,因为两个导航将会出现并将出现在浏览器历史记录中。如果用户尝试向后导航,则他/她不能,因为导航回home
路线,这将立即导航到所选的子路线。
“正确”方式(在Aurelia文档中):在配置路由器时使用navigationStrategy回调。这就是如何设置子路由器:
configureRouter(config: RouterConfiguration, router: Router) {
const navStrat = (instruction: NavigationInstruction) => {
instruction.config.redirect = 'pick one child route';
};
config.map([
{ name: 'redirecter', route: '', navigationStrategy: navStrat },
{ name: 'documents', route: 'documents' },
{ name: 'images', route: 'images' },
{ name: 'specs', route: 'specs' }
]);
}
这将导致一个导航周期,并且可以实现任何动态重定向逻辑。