Aurelia - 儿童路线中的动态重定向

时间:2016-12-12 10:26:37

标签: aurelia aurelia-router

我有一个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/12345home activate方法结束。

我们在这里重定向,让我们对specs说。但由于过时group/12345/specs,我们将group/98765/specs代替baseUrl

应该如何解决?

我已经看到儿童路由器baseUrl的一些相关问题,建议在导航之前手动修复到常量。但是,由于模板化路由(比本例中显示的更复杂),这并不像将baseUrl设置为常量字符串那么容易。

1 个答案:

答案 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'                                  }    
    ]);
}

这将导致一个导航周期,并且可以实现任何动态重定向逻辑。