在Angular中,是否可以根据用户是否经过身份验证来加载不同的模块?
例如,如果用户经过身份验证,URL:www.example.com应该加载一个模块,否则它应该加载另一个模块 我尝试过使用防护装置,但没有达到我预期的效果。 我是个新手。如果有人能为演示编写一个示例routes数组,我们将不胜感激。:)强> 如果用户未通过身份验证,则我希望我的路由工作如下:在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
{
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,请检查此选项,这可能有助于满足您的需要: