我已经向延迟加载的状态添加了一个 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);
}
}
}
我尝试注入(inject) ActivatedRoute 以尝试从那里获取它们以从那里获取它,但什么也没有。
如果用户在浏览器中输入 URL,则没有问题,因为我可以从 location 对象中提取参数。但是在使用 route.navigate 时,浏览器的位置仍然设置为之前的状态。
任何帮助或想法将不胜感激。
最佳答案
我尝试做类似的事情,最终改为使用 canActivate 守卫。另请注意,canLoad 防护会阻止您可能想要执行的任何预加载。
从理论上讲,如果用户无法访问路线,甚至不加载它也很好。但它的实践似乎太有限,无法做出决定。
您可以尝试一些东西(我之前尝试这样做时没有想到)……您可以添加一个父路由(无组件),它具有可以检查参数的 canActivate 防护。如果用户有授权,则路由到延迟加载的路由。
关于javascript - Angular 2 : how do I get route parameters from CanLoad implementation?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43857783/