我添加了一个canLoad后卫这就是延迟加载的状态。说我遇到的问题是,我不能得到任何路由参数,如果国家正在从不同的使用状态router.navigate初始化()。
因此,这里是我的路由配置:
path: 'programs/:programId/dashboard',
loadChildren: './program.module#ProgramModule',
canLoad: [ProgramGuard]
这是ProgramGuard短版本:
export class ProgramGuard implements CanLoad {
canLoad(route: Route): Observable<boolean> {
//route object doesn't have any reference to the route params
let programId = paramFromRoute;
return Observable.create(observer => {
if (programId == authorizedProgramId)
observer.complete(true);
else
observer.complete(false);
}
}
}
我试图注入ActivatedRoute,试图从那里得到他们从那里得到它,但一无所获。
如果用户在浏览器中的URL,那么就没有问题,因为我可以提取位置对象的参数。但是,使用route.navigate时,浏览器的位置仍设置到以前的状态。
任何帮助或想法,将不胜感激。
我试图做同样的事情,并最终改变一个canActivate后卫来代替。还要注意的是,canLoad护拦网,你可能需要做任何预载。
从理论上讲,如果用户无法访问的路线,这将是巨大的,甚至不加载它。但是,实践它似乎过于限制,以便作出决定。
有些事情,你可以尝试(我没想到的是年初的时候,我试图做到这一点)...你可以添加具有canActivate后卫,可以检查该参数的父路由(无部件)。然后,路线,如果用户已被授权的延迟加载路线。
我能够检索包括使用Location
对象的路由参数的路径。
canLoad() {
//dont even load the module if not logged in
if (!this.userSessionService.isSessionValid()) {
this.userSessionService.redirectUrl = this.location.path();
this.router.navigate(['/auth']);
return false;
}
return true;
}
你只需要注入Location对象的构造函数。
首先,你可以声明变量如下所示:
routeSnapshot: ActivatedRouteSnapshot;
然后在构造函数中调用ActivatedRouteSnapshot类像下面这样:
constructor(private routeSnapshot: ActivatedRouteSnapshot)
现在你可以使用this.routeSnapshot到canLoad方法