我已经向延迟加载的状态添加了一个 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/

10-09 18:00
查看更多