角度二:我如何才能从CanLoad实现路由参数?

问题描述 投票:2回答:3

我添加了一个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时,浏览器的位置仍设置到以前的状态。

任何帮助或想法,将不胜感激。

javascript angular angular-ui-router
3个回答
3
投票

我试图做同样的事情,并最终改变一个canActivate后卫来代替。还要注意的是,canLoad护拦网,你可能需要做任何预载。

从理论上讲,如果用户无法访问的路线,这将是巨大的,甚至不加载它。但是,实践它似乎过于限制,以便作出决定。

有些事情,你可以尝试(我没想到的是年初的时候,我试图做到这一点)...你可以添加具有canActivate后卫,可以检查该参数的父路由(无部件)。然后,路线,如果用户已被授权的延迟加载路线。


1
投票

我能够检索包括使用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对象的构造函数。


0
投票

首先,你可以声明变量如下所示:

routeSnapshot: ActivatedRouteSnapshot;

然后在构造函数中调用ActivatedRouteSnapshot类像下面这样:

constructor(private routeSnapshot: ActivatedRouteSnapshot)

现在你可以使用this.routeSnapshot到canLoad方法

© www.soinside.com 2019 - 2024. All rights reserved.