如何在Angular中设置用户特定的路由?

如何在Angular中设置用户特定的路由?,angular,angular-routing,angular-router,Angular,Angular Routing,Angular Router,我有一个Angular 6应用程序,它使用提供商信息来确定应用程序的功能(频道)。我正在处理一个在用户登录后从服务器接收的对象,该对象为我提供相应通道的布尔值 providerInfos = { channels: { a: true, b: true, c: true } } 在index.html中,我有 <base href="/home/"> 因此,当应用程序初始化时,会加载一个(某处.io/home/A)。到目前为止这还不错,但由于该应

我有一个Angular 6应用程序,它使用提供商信息来确定应用程序的功能(频道)。我正在处理一个在用户登录后从服务器接收的对象,该对象为我提供相应通道的布尔值

providerInfos = {
  channels: {
    a: true,
    b: true,
    c: true
  }
}
在index.html中,我有

<base href="/home/"> 
因此,当应用程序初始化时,会加载一个(某处.io/home/A)。到目前为止这还不错,但由于该应用程序的进一步开发,结果证明a也不能作为频道。这给我带来了一个问题,我还没有解决。我越是思考和查看我的代码,就越觉得我以前的方法基本上是错误的

在初始化应用程序时,如果应用程序功能中没有A,我希望能够将B或C显示为第一个或唯一的视图(某处.io/home/where)。原则上,我希望根据用户通过其提供商信息定义的功能为应用程序提供路由,至少是

path: '', redirectTo: 'whatever', pathMatch: 'full'
如果只提供一个功能

我可以通过提供程序信息自定义功能,以便自定义侧栏中的菜单,并且如果有人想在URL栏中输入路径,我可以通过*ngIf访问不属于该功能的组件。但我无法相应地调整路线


你将如何处理这个问题。有最佳实践吗?

您可以使用路线守卫来实现此功能。路由保护不仅阻止用户访问路由,还允许您通过返回
UrlTree
告诉路由器导航到哪里

鉴于以下路线:

const路由=[
{路径:'',重定向到:'a',路径匹配:'full'},
{path:'a',component:ComponentA,canActivate:[AuthGuard]},
{路径:“b”,组件:ComponentB}
];
我可以按如下方式设置我的
AuthGuard

@可注入({
providedIn:'根'
})
导出类AuthGuard实现了CanActivate{
构造函数(专用路由器:路由器,专用用户服务:用户服务){
}
canActivate():布尔| UrlTree{
const user=this.userService.getCurrentUser();
const userCanAccessA=false;//TODO:实现
如果(用户可访问){
返回true;
}
//重定向到/b
返回此.router.parseUrl('/b');
}
}
我并不推荐这个例子作为一个好的实现,我只是演示了一个路由守卫的能力。您的需求将决定路由的结构,以及重定向逻辑是什么

让警卫做很多工作是很有诱惑力的。相反,我会让每个警卫专注于执行特定任务。然后,如果需要,您可以通过组合保护来组合保护逻辑

请注意,在我下面的演示中,从未构造组件A,因为
AuthGuard
在路由发生之前阻止访问


演示:

您可以使用route guard来实现此功能。路由保护不仅阻止用户访问路由,还允许您通过返回
UrlTree
告诉路由器导航到哪里

鉴于以下路线:

const路由=[
{路径:'',重定向到:'a',路径匹配:'full'},
{path:'a',component:ComponentA,canActivate:[AuthGuard]},
{路径:“b”,组件:ComponentB}
];
我可以按如下方式设置我的
AuthGuard

@可注入({
providedIn:'根'
})
导出类AuthGuard实现了CanActivate{
构造函数(专用路由器:路由器,专用用户服务:用户服务){
}
canActivate():布尔| UrlTree{
const user=this.userService.getCurrentUser();
const userCanAccessA=false;//TODO:实现
如果(用户可访问){
返回true;
}
//重定向到/b
返回此.router.parseUrl('/b');
}
}
我并不推荐这个例子作为一个好的实现,我只是演示了一个路由守卫的能力。您的需求将决定路由的结构,以及重定向逻辑是什么

让警卫做很多工作是很有诱惑力的。相反,我会让每个警卫专注于执行特定任务。然后,如果需要,您可以通过组合保护来组合保护逻辑

请注意,在我下面的演示中,从未构造组件A,因为
AuthGuard
在路由发生之前阻止访问


演示:

您是否考虑过在需要时重定向的路线守卫?@Kurt Hamilton:谢谢您的提示!我刚刚看了一眼路障,我会再考虑使用路障,但我认为他们不能完全解决我的问题。当我想拒绝用户访问路由时,它们特别有用。情况也是如此,但最大的挑战是我想自定义第一个视图
路径:'',重定向到:'whatever'…
,如果它不是组件A,我特别想寻找一种方法,根据用户类型交换整个routes数组,以便使全部功能“不可见”而且只存在需要的路线。你考虑过在需要时重定向的路线守卫吗?@Kurt Hamilton:谢谢你的提示!我刚刚看了一眼路障,我会再考虑使用路障,但我认为他们不能完全解决我的问题。当我想拒绝用户访问路由时,它们特别有用。情况也是如此,但最大的挑战是我想自定义第一个视图
路径:'',重定向到:'whatever'…
,如果它不是组件A,我特别想寻找一种方法,根据用户类型交换整个routes数组,以便使全部功能“不可见”而且只存在所需的路由。@Kurt Hamilton我现在已经通过一个简单的路由保护解决了这个问题,因为urlTree只能从中返回。最后似乎是
path: '', redirectTo: 'whatever', pathMatch: 'full'