在Angular中,是否可以根据用户是否经过身份验证来加载不同的模块?

在Angular中,是否可以根据用户是否经过身份验证来加载不同的模块?,angular,angular-router,angular-router-guards,angular-route-guards,Angular,Angular Router,Angular Router Guards,Angular Route Guards,例如,如果用户经过身份验证,URL:www.example.com应该加载一个模块,否则它应该加载另一个模块 我尝试过使用防护装置,但没有达到我预期的效果。 我是个新手。如果有人能为演示编写一个示例routes数组,我们将不胜感激。:) 如果用户未通过身份验证,则我希望我的路由工作如下: { path: '', loadChildren: './home/home.module#HomeModule' }, { path: 'login', loadC

例如,如果用户经过身份验证,URL:www.example.com应该加载一个模块,否则它应该加载另一个模块

我尝试过使用防护装置,但没有达到我预期的效果。

我是个新手。如果有人能为演示编写一个示例routes数组,我们将不胜感激。:)

如果用户未通过身份验证,则我希望我的路由工作如下:

  {
    path: '',
    loadChildren: './home/home.module#HomeModule'
  },
  {
    path: 'login',
    loadChildren: './login/login.module#LoginModule'
  },
  {
    path: 'register',
    loadChildren: './register/register.module#RegisterModule'
  }
  {
    path: '',
    pathMatch: 'full',
    redirectTo: '/dashboard'
  },
  {
    path: 'dashboard',
    loadChildren: './dashboard/dashboard.module#DashboardModule'
  },
  {
    path: 'profile',
    loadChildren: './user-profile/user-profile.module#UserProfileModule'
  }
否则,如果用户经过身份验证,我希望我的路由工作如下:

  {
    path: '',
    loadChildren: './home/home.module#HomeModule'
  },
  {
    path: 'login',
    loadChildren: './login/login.module#LoginModule'
  },
  {
    path: 'register',
    loadChildren: './register/register.module#RegisterModule'
  }
  {
    path: '',
    pathMatch: 'full',
    redirectTo: '/dashboard'
  },
  {
    path: 'dashboard',
    loadChildren: './dashboard/dashboard.module#DashboardModule'
  },
  {
    path: 'profile',
    loadChildren: './user-profile/user-profile.module#UserProfileModule'
  }

是的,您可以使用
CanActivate
guard(检查路线访问)来实现这一点

can激活
检查用户是否可以访问路由


我已经说过,我希望您在
guardCheck
之后重定向到不同的路由

您不应该将路由器配置为在同一路由上容纳两个不同的组件或模块。 您可以将它们作为路由的子级添加,并在同一路由上需要它们时决定路由

更新

我遇到了
matcher
的概念,它可以用于在同一路径上加载两条不同的路由:

const routes: Routes = [{
  path: 'list',
  matcher: matcherForAuthenticatedRoute,
  loadChildren: './user/register#RegisterModule'
},
{
  path: 'list',
  matcher: matcherForTheOtherRoute,
  loadChildren: './user/home#HomeModule'
}]
现在,我们的匹配逻辑取决于两个函数,它们可以如下所示:

export function matcherForAuthenticatedRoute(
 segments: UrlSegment[],
 group: UrlSegmentGroup,
 route: Route) {
  const userService =  appInjector.get(MyService);
  const isPathMatch = segments[0].path === route.path;
  const isUserAuthenticated = userService.isUserAuthenticated('userId');      
  if(isPathMatch && isUserTypeMatch) { 
    return {consumed: [segments[0]]};
  } else {
    return null;
  }
}
引导应用程序后,我们可以定义
appInjector
,并将其导出以供使用:

appInjector = componentRef.injector;

读了这篇文章,你需要
route-guard
我试过了。它不起作用。如果用户经过身份验证,我也希望这样:{path:'',loadChildren:'./dashboard/dashboard.module#DashboardModule'}在用户是否经过身份验证的条件下,我应该如何在同一URL上加载两个完全不同的模块?我希望您在guardCheck之后重定向到不同的路由。您不能将路由器配置为在同一路由上容纳两个不同的组件或模块。您可以将它们作为路由的子级添加,并决定是否在同一路由上需要它们。@FaisalAlam,请检查此选项,这可能有助于满足您的需要: