Angular 4:如何在应用程序初始化时通过 REST 设置路由器配置
Angular 4: How to set the router config via REST on application init
我正在尝试根据来自 REST API 的数据设置路由器配置(包含允许的 urls 等)。在这种情况下,url /test2 应该在 HomeComponent 中结束。 Url test2 不存在于初始路由配置中,它是通过承诺添加的。
到目前为止,我使用的方法如下:
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 结束。
知道如何完成这项工作吗?也许我在错误的区域搜索解决方案:(
如我的评论所述,您必须将动态路线放在通配符路线之前,然后您可以使用 Router.navigateByUrl
导航到添加的路线,但您必须检查您是否想去的路线是您动态路线的一部分。因为否则你将陷入无限循环。
我做了一个例子plunker。
注意:该示例在每次调用 CanActivate
守卫时添加路由,因此您必须在添加新路由时过滤掉现有路由。
我正在尝试根据来自 REST API 的数据设置路由器配置(包含允许的 urls 等)。在这种情况下,url /test2 应该在 HomeComponent 中结束。 Url test2 不存在于初始路由配置中,它是通过承诺添加的。
到目前为止,我使用的方法如下:
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 结束。
知道如何完成这项工作吗?也许我在错误的区域搜索解决方案:(
如我的评论所述,您必须将动态路线放在通配符路线之前,然后您可以使用 Router.navigateByUrl
导航到添加的路线,但您必须检查您是否想去的路线是您动态路线的一部分。因为否则你将陷入无限循环。
我做了一个例子plunker。
注意:该示例在每次调用 CanActivate
守卫时添加路由,因此您必须在添加新路由时过滤掉现有路由。