gpt4 book ai didi

Angular:如何在RouteGuard中相对于目标路由调用router.navigate()?

转载 作者:行者123 更新时间:2023-12-03 23:37:12 25 4
gpt4 key购买 nike

我有一个使用 Angular 4 开发的现有项目。我需要根据用户权限控制对特定路由的访问。简化的路由配置如下所示:

[
{ path: '', redirectTo: '/myApp/home(secondary:xyz)', pathMatch: 'full' },
{ path: 'myApp'
children: [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'home', ... },
...
{ path: 'product'
children: [
{ path: '', redirectTo: 'categoryA', pathMatch: 'full' },
{ path: 'categoryA', component: CategoryAComponent, canActivate: [CategoryACanActivateGuard]},
{ path: 'categoryB', component: CategoryBComponent},
...
]
},
...
]
},
...
]

现在,我想控制对 www.myWeb.com/myApp/product/categoryA 的访问。 .如果用户没有足够的权限,他/她将被重定向到 ... /product/CategoryB .我写了一个 CanActivate RouteGuard 做到这一点,守卫类看起来像这样:
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot, ActivatedRoute } from '@angular/router';
import { MyService } from '... my-service.service';

@Injectable()
export class CategoryACanActivateGuard implements CanActivate {
constructor(private myService: MyService, private router: Router) { }

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
return this.myService.checkPermission()
.then(result => {
if (!result.hasAccess) {
//redirect here

this.router.navigate(['./myApp/product/categoryB']);
//works, but I want to remove hardcoding 'myApp'

//this.router.navigate(['../../categoryB']);
//doesn't work, redirects to home page

//this.router.navigate(['./categoryB'], { relativeTo: this.route});
//do not have this.route object. Injecting Activated route in the constructor did not solve the problem

}
return result.hasAccess;
});
}
}

一切正常,但我希望相对于目标路由进行重定向,如下所示:
this.router.navigate(['/product/categoryB'], { relativeTo: <route-of-categoryA>});
// or
this.router.navigate(['/categoryB'], { relativeTo: <route-of-categoryA>});

不幸的是, relativeTo仅接受 ActivatedRoute对象和我所拥有的只有 ActivatedRouteSnapshotRouterStateSnapshot .有没有办法相对于目标路线(在本例中为 categoryA)进行导航?任何帮助将不胜感激。

注:
  • 除了添加一些路由保护之外,我无法更改路由配置。
  • 我不是在寻找 this.router.navigateByUrl使用 state.url .我想使用 router.navigate([...], { relativeTo: this-is-what-need}) .
  • 最佳答案

    事实证明,构造函数注入(inject) ActivatedRoute与其他地方(如组件)相比,RouteGuard 中的工作方式不同。

    在一个组件中,ActivatedRoute object 指向激活该组件的路由。例如,在 CategoryAComponent类,以下代码将导航到 CategoryB:

    this.router.navigate([ '../CategoryB' ], { relativeTo: this.route });

    但是,上面相同的代码在 RouteGuard 中不起作用。类添加到 CategoryA 路由配置。在我的测试中,我发现构造函数注入(inject)了 ActivatedRoute对象指向根路由。另一方面, ActivatedRouteSnapshot object(在 canActivate 函数中作为参数传入)指向目标路由(在我的例子中为 categoryA)。但是,我们不能通过 ActivatedRouteSnapshot this.router.navigate(...) 中的对象功能。

    我找不到更好的方法来解决这个问题,但下面的代码对我有用:
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    return this.myService.checkPermission()
    .then(result => {
    if (!result.hasAccess) {
    //redirect here

    let redirectTo = route.pathFromRoot
    .filter(p => p !== route && p.url !== null && p.url.length > 0)
    .reduce((arr, p) => arr.concat(p.url.map(u => u.path)), new Array<string>());

    this.router.navigate(redirectTo.concat('categoryB'), { relativeTo: this.route });
    }
    return result.hasAccess;
    });
    }

    关于Angular:如何在RouteGuard中相对于目标路由调用router.navigate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49806553/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com