Typescript 如何在Angular2中使用动态默认路由?

Typescript 如何在Angular2中使用动态默认路由?,typescript,angular,angular2-routing,Typescript,Angular,Angular2 Routing,问题:根据用户的权限,应使用另一个默认路由 @RouteConfig([ { path: '/x1', name: 'x1', component: X1Component, useAsDefault: true }, { path: '/x2', name: 'x2', component: X2Component}, { path: '/x3', name: 'x3', component: X3Component}, { path: '/x4', name:

问题:根据用户的权限,应使用另一个默认路由

@RouteConfig([
    { path: '/x1', name: 'x1', component: X1Component, useAsDefault: true },
    { path: '/x2', name: 'x2', component: X2Component},
    { path: '/x3', name: 'x3', component: X3Component},
    { path: '/x4', name: 'x4', component: X4Component},
    { path: '/x5', name: 'x5', component: X5Component}
])
如果将
x1
作为上述
RouteConfig
中的默认路由,但当前用户没有访问此页面的权限,
x2
应作为默认路由,如果将授予权限,依此类推

无论如何,我们已经尝试了属性
loader
。存在的问题是,url不会被更新(例如从
/x1
x2
),这会出现其他问题,例如没有将css类
路由器链接激活
自动附加到菜单中的链接


当然,我们可以写一个变通方案,但你是如何解决这类问题的

我认为在运行时不可能更改默认路由

我认为一种常见的方法是向需要登录的组件添加
@CanActivate()
装饰器,如果用户没有实际登录,则重定向到适当的路由

要知道当前用户是否已登录,您可能需要使用DI获取有关用户状态的全局信息。
您还需要对根路由器实例的引用,您可以从DI获得该引用。 目前不直接支持在
@CanActivate()
中使用DI,但中的讨论提供了一种解决方法(使用Plunker链接)以获取全局注入器的参考


另请参见

动态更改角度应用程序的默认路径,此时我正在使用以下方法

最后一条有警卫的撤退路线:

...
{
    path: '**',
    canActivate: [DynamicDefaultRouteGuard],
    pathMatch: 'full'
}
防护装置如下所示:

@Injectable({
    providedIn: 'root'
})
export class DynamicDefaultRouteGuard implements CanActivate {
    constructor(private router: Router, private dynamicDefaultMenuSectionService: DynamicDefaultMenuSectionService) {}

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot
    ): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
        console.warn(
            `Fallback main module route reached. Redirecting to ${this.dynamicDefaultMenuSectionService.defaultMenuSection}...`
        );

        return this.router.createUrlTree([this.dynamicDefaultMenuSectionService.defaultMenuSection]);
    }
}
@可注入({
providedIn:'根'
})
导出类DynamicDefaultRouteGuard实现CanActivate{
构造函数(专用路由器:路由器,专用DynamicDefaultMenusActionService:DynamicDefaultMenusActionService){}
激活(
下一步:ActivatedRouteSnapshot,
状态:RouterStateSnapshot
):可观察的|承诺|布尔| UrlTree{
console.warn(
`已到达回退主模块路由。正在重定向到${this.dynamicDefaultMenuSectionService.defaultMenuSection}`
);
返回此.router.createUrlTree([this.dynamicDefaultMenusActionService.DefaultMenusAction]);
}
}
其中
dynamicDefaultMenusActionService.DefaultMenusAction
是具有默认路由的变量。此变量在应用程序初始化(app_INITIALIZER)期间初始化,但可以随时更改