Отложенная загрузка вложенного модуля и маршрутизация

У меня проблема с маршрутизацией внутри лениво загруженных модулей.

Вот мои "корневые" маршруты:

const routes: Routes = [
  {path: '', redirectTo: 'admin', pathMatch: 'full' },
    {path: 'admin', loadChildren: 'app/admin.module#AdminModule'}
];

@NgModule({
  imports: [
      RouterModule.forRoot(routes)
  ],
  exports: [
      RouterModule
  ]
})
export class MainRoutingModule {}

Так что я ожидаю от моего приложения, это перенаправить пустой путь к /admin - это работает нормально, модуль загружен.

в AdminModule я получил еще одно перенаправление:

const routes: Routes = [
    {path: '', component: AdminComponent, children: [
        {path: '', redirectTo: 'app', pathMatch: 'full' },
        {path: 'app', loadChildren: './app/app.module#AppModule', canActivate: [ AuthGuard ] },
        {path: 'login', component: LoginComponent}
    ]},
];

@NgModule({
    imports: [
        RouterModule.forChild(routes),
        AppModule
    ],
    exports: [
        RouterModule
    ]
})
export class AdminRoutingModule {}

Здесь я получил два сценария:

  • если пользователь аутентифицирован перенаправить на app - так что весь путь будет /admin/app
  • иначе перенаправить на login - так весь путь должен быть /admin/login

и, наконец, маршрутизация в приложении администратора:

const routes: Routes = [
  { path: '', component: AppComponent, children: [
    { path: '',  redirectTo: 'home', pathMatch: 'full' },
    { path: 'home', component: HomeComponent},
  ]}
];

И теперь проблемы начинаются. Если я войду в мою сторону с URL localhost:3000/admin/app/(*) все работает, как и ожидалось, AuthGuard вызывается, URL-адрес в порядке, в случае, если пользователь не прошел проверку подлинности, он перенаправляется на страницу входа.

Но! Если я войду localhost:3000 приложение перенаправляет меня на localhost:3000/admin/home (app отсутствует) и AuthGuard не вызывается. Похоже, что Angular пропускает admin-routing.module и идет прямо к последнему.

Какова причина? Как я могу это исправить?

1 ответ

В AdminModule Вы можете добавить canActivate в маршрут по умолчанию.

const routes: Routes = [
    {path: '', component: AdminComponent, children: [
        {path: '', redirectTo: 'app', pathMatch: 'full'  canActivate: [ AuthGuard ]},
        {path: 'app', loadChildren: './app/app.module#AppModule', canActivate: [ AuthGuard ] },
        {path: 'login', component: LoginComponent}
    ]},
];
Другие вопросы по тегам