为什么Guard不能在嵌套路由中工作 - Angular 5

时间:2018-03-11 18:02:08

标签: angular angular5 angular-routing

我已经创建了Guards,以防止他们进入权限不足的网页。

但我想知道,为什么我被迫在每条路线上添加卫兵。我认为第一条路线上的守卫应该足够孩子们懒得加载。但事实并非如此。我做错了什么,或者这是Angular的工作原理?

app.routing.ts

export const routes: Routes = [
    { path: "", component: HomeComponent },
    { path: "groups", loadChildren: "app/main/main.module#MainModule",
        canLoad: [AuthCanLoadGuard] } // <-- guard on first route
];

儿童:

main.routing.ts

export const routes: Routes = [
    { path: "groups", component: GroupListComponent, canActivate: [AuthGuard] },
    { path: "groups/:id/category", component: CategoryComponent, canActivate: [AuthGuard] },
    {
        path: "groups/:id/category", component: GroupSummaryComponent, children: [
            { path: "bikes", canLoad: [AuthCanLoadGuard], loadChildren: "app/features/bikes/bikes.module#BikesModule" },
            { path: "cars", canLoad: [AuthCanLoadGuard] loadChildren: "app/features/cars/cars.module#CarsModule" },
        ]
    }
];

正如你在 main.routing.ts 中看到的那样,我必须为所有路线添加防护装置以使其正常工作。那是为什么?

编辑:

我已经调试过,似乎没有进入MainModule的AuthCanLoadGuard。但是对于BikesModule和CarsModule工作正常。但我不知道为什么......

编辑2:

问题解决了。问题在于路线配置。

  1. 确保您没有将MainModule导入AppModule(这就是为什么我可以在 main.routing.ts 中的路径中groups的原因是什么因为父母已经group已经错误

  2. Main.Module中的RouterModule.forRoot应为forChild

1 个答案:

答案 0 :(得分:1)

尝试使用canActivateChildren。我不确定canLoad的用途是什么,从未使用它。

编辑:你的孩子路线看起来也不错。他们不应该使用“群组”加注星标,因为该部分会在父级中被捕获。所以在main.routing { path: "groups",应该是{ path: "",