当前位置: 首页 > 知识库问答 >
问题:

在延迟加载模块上具有第二激活保护的路由器无限循环

谷梁云瀚
2023-03-14

我有一个angular 4.3.6应用程序,带有延迟加载的模块。这是一个部分根路由器:

const routes: Routes = [
  { path: '', redirectTo: 'fleet', pathMatch: 'full' },
  {
    path: '',
    component: AppComponent,
    canActivate: [AuthenticationGuard],
    children: [
      {
        path: 'fleet',
        loadChildren: "./modules/fleet.module",
        canActivate: [AuthenticationGuard]
      },
      {
        path: 'password/set',
        loadChildren: "./modules/chooseNewPassword.module",
        canActivate: [ChoosePasswordGuard]
      }
    ]
  }
]
// Exports RouterModule.forRoot(routes, { enableTracing: true });

舰队:

RouterModule.forChild([
  {
    path: '',
    component: FleetComponent,
    canActivate: [AuthenticationGuard]
  }
]);

RouterModule.forChild([
  {
    path: '',
    component: ChooseNewPasswordComponent,
    canActivate: [ChoosePasswordGuard]
  }
]);

< code>AuthenticationGuard调用如下所示的方法:

return this.getUserSession().map((userSession: UserSession) => {
  if (userSession && userSession.ok) {
    return true;
  }
  else if (userSession && userSession.expired) {
    this.router.navigate(['password/set'])
      .catch((e: Error) => console.error(e));
    return true;
  }
  else {
    window.location.replace('/');
    return false;
  }
}

因此,如果用户的会话正常,它将激活路由。如果用户的密码过期,它会将用户重定向到“选择新密码”模块。如果没有会话,则重定向到登录

ChooseSPasswordGuard做了类似的事情,但只保护choose new password组件(通常使用不同的功能设置密码):

return this.getUserSession().map((userSession: UserSession) => {
  if (userSession) {
    return userSession.expired;
  }
  else {
    return false;
  }
});

  1. 导航启动(id:4,url:“/password/set”)
  2. 路由识别为{id:4,url:“/password/set”,urlAfterRedirects:“/password/set”,状态:RouterStateSnapshot}
  3. GuardsCheckStart{id:4,url:“/password/set”,urlAfterRedirects:UrlTree,状态:RouterStateSnapshot}
  4. GuardsCheckEnd{id:4,url:“/password/set”,urlAfterRedirects:UrlTree,状态:RouterStateSnapshot,应激活:true}
  5. 导航取消{id:4,url:“/password/set”,原因:“}”

并且该循环重复。

(如果我用< code>return Observable.of(true)替换整个ChooseNewPasswordGuard也会重复);)

编辑:即使我在URL栏中提供了< code>/#/password/set,我也会被重定向到根页面(< code>/)...

问题:

> < li>

现在模块是延迟加载的,我在路由器或防护中做错了什么来强制此循环?我对< code>shouldActivate: true后跟< code > navigation cancel reason:" " 感到特别困惑。

我真的需要在我的子路由和根路由中重复激活保护吗?

和往常一样,欢迎任何其他评论。

共有1个答案

应安国
2023-03-14

问题是我过度应用了< code>AuthenticationGuard:它不应该应用于顶级AppComponent,因为它总是会重定向到Choose New Password模块,即使它正在加载该模块。

我的根路由应该如下所示:

const routes: Routes = [
  { path: '', redirectTo: 'fleet', pathMatch: 'full' },
  {
    path: '',
    component: AppComponent,
    // canActivate: [AuthenticationGuard], // <-- Remove this guard
    children: [
      {
        path: 'fleet',
        loadChildren: "./modules/fleet.module",
        canActivate: [AuthenticationGuard]
      },
      {
        path: 'password/set',
        loadChildren: "./modules/chooseNewPassword.module",
        canActivate: [ChoosePasswordGuard]
      }
    ]
  }
]

(我欢迎并乐意接受更好的解释或更好的身份验证保护模式。)

 类似资料:
  • 不确定我是否做对了一切。但问题是:当我从延迟加载的模块导航到组件的某些子路由时,它根本不加载。它从延迟加载模块重新加载主组件。 app-routing.component.ts planet-detector-routeting.module.ts 所以在上面的例子中,当你输入“http://localhost:4200/planet-detector/first”时,它会加载DetectorCo

  • 为了显示这种关系,让我们开始定义一个简单的模块,作为我们的示例应用程序的根模块。 app/app.module.ts 到目前为止,这是一个非常常见的模块,依赖于,有一个路由机制和两个组件:AppComponent和EagerComponent。 现在,让我们专注于定义导航的应用程序(AppComponent)的根组件。 app/app.component.ts import { Component

  • 我试图实现延迟加载,但得到如下错误** 错误错误:未捕获(在promise中):错误:BrowserModule已加载。如果您需要从一个延迟加载的模块中访问一些公共指令,比如NgIf和NgFor,那么可以导入CommonModule。 ** 需要帮助这是我的模块 共享模块 2.设置模块 5.AppModule

  • 问题内容: 我试图在UI-Router router.js文件中延迟加载控制器和模板,但是在模板处理上遇到困难。 控制器已正确加载,但是在加载之后,我们必须加载模板,这就是问题所在。 ocLazyLoad加载控制器后,我们解析了一个Angular Promise,它也包含在templateProvider中。问题在于,在文件加载完成后,不是返回诺言(templateDeferred.promise

  • 问题内容: 感谢Dan Wahlin的精彩文章,我设法实现了Angular的控制器和服务的延迟加载。但是,似乎没有一种干净的方法来懒惰加载独立的模块。 为了更好地解释我的问题,假设我有一个没有RequireJS的应用,其结构如下: 这是在Plunker中带有RequireJS的示例应用程序:http ://plnkr.co/aiarzVpMJchYPjFRrkwn 问题的核心是Angular不允许

  • 我对这个(OSGI)真的是新手,试图做简单的例子。我不能让懒惰的修辞奏效。我知道有一些解决这些问题的蓝图,但在开始之前,我认为学习一些基础知识是很好的。 好吧,我已经改变了我的代码,但仍然没有运气。 外部应用程序,install bundles,启动framework,然后只启动DataServiceClient Bundle。不能访问任何bundle类。 以下是DataServiceClient