【问题标题】:Angular 2 routing always go through root /Angular 2 路由总是通过 root /
【发布时间】:2017-09-13 11:33:31
【问题描述】:

如果我有这样的路由配置:

app-routing.module.ts

const routes: Routes = [
  { path: '', loadChildren: './private/private.module#PrivateModule' },
  { path: 'login', component: LoginComponent }
];

当我导航到/login 时,延迟加载的私有模块将始终加载。最大的问题是如果我在那里有canLoad 守卫,那么只有经过身份验证的用户才能访问它。但是,如果每次我去/login 我都会通过canLoad 守卫将重定向回/login 将再次通过canLoad 等等 - 将创建一个无限循环。对此有任何想法或解决方法。

理想情况下,我希望有一个公共路由/login 和一个私有模块/,其中将包含私有模块以及它们之间的共享模块,这些模块将被延迟加载。我不想在路由上有任何前缀,这就是为什么我想使用根路由/

|_ core
|_ shared
|_ login
|_ private
|____ shared
|____ core
|____ dashboard
|____ etc

编辑:

为了说明这里是一个截图:

当我登录时,您可以看到0.chunk.js 已加载,这是私有模块。当它在/ 路由上定义并且我不在/ 路由上时,它不应该加载。

【问题讨论】:

  • 那么你的问题是什么?
  • 如果我为根路由包含canLoad 保护,如何避免无限循环。或者换句话说,如果我导航到/login,如何避免通过定义的根路由?
  • 请检查编辑。
  • 我稍后看看

标签: angular angular2-routing angular-cli


【解决方案1】:

从登录路由中删除canActive,并在''路由中添加canLoad: [LoginGuard]。由于您的腰部路线是在路线上,因此不需要有人看守。

const routes: Routes = [
  { path: '', loadChildren: './private/private.module#PrivateModule', canLoad: [LoginGuard] },
  { path: 'login', component: LoginComponent }
];

【讨论】:

  • LoginGuard 保护经过身份验证的用户返回/login 页面。延迟加载的模块也不需要canActivate。应该是canLoad
  • 在他的情况下,登录守卫发送到登录页面,然后登录页面发送到登录守卫并进入无限循环。所以同样的事情可以在一个守卫中处理
  • 现在改为 canLoad
  • 忘记LoginGuard。这不是问题。你不知道这是什么逻辑。你为什么要移动它?我将从问题中删除它。我想这让你感到困惑。
  • 我觉得你有点糊涂了!您的腰部页面将是公开的,任何未经身份验证的人都可以使用它。所以那里不需要守卫。所以我不是在谈论 loginGuard(没有登录保护)。对于其他路由,添加一个警卫,当用户未通过身份验证时,将它们重定向到登录页面。在登录组件中检查用户对象是否可用,然后将其重定向到''路由。在 auth guard 中始终检查用户对象是否可用,因此当用户对象可用时,用户已登录并加载模块并重定向到那里。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 2023-03-02
  • 2018-01-30
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2016-10-09
相关资源
最近更新 更多