我正在尝试根据REST API中的数据设置路由器配置(包含允许的URL等)。在这种情况下,url / test2应该以HomeComponent结束。 Url test2在初始路由配置中不存在,它由promise承担。
到目前为止,我使用的方法如下:
RouterModule.forRoot([
{
path: '',
component: HomeComponent
},
{
path: '**',
resolve: {
route: RouteResolver
},
component: ErrorComponent
}
])
解析器负责添加新路线。
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any>|Promise<any>|any {
return new Promise((resolve, reject) => { // just to fake api call
console.log(this.router.config);
this.router.config.push(
{
path: 'test2',
component: HomeComponent
}
);
this.router.resetConfig(this.router.config);
console.log(this.router);
resolve();
});
}
这种方法的问题似乎我已经太迟了一步。新路由确实被添加到路由配置中,配置确实被重置。但是在解析器执行期间,应用程序似乎还没有意识到这一点。所以我仍然在ErrorComponent。
任何想法是如何完成的?也许我在错误的区域寻找解决方案:(
答案 0 :(得分:2)
如我的评论中所述,您必须将动态路线放在通配符路线之前,然后您可以使用Router.navigateByUrl
导航到添加的路线,但您必须检查您想要去的路线是否是您的动态路线。因为否则你会陷入无休止的循环。
我用一个例子做了plunker。
注意:每次调用CanActivate
后卫时,该示例都会添加路由,因此您必须在添加新路由时过滤掉现有路由。