Ваша проблема в том, как сконфигурирована ваша маршрутизация.
Сведение к проблемным маршрутам оставляет следующую конфигурацию:
const PUBLIC_ROUTES: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'login', component: LoginComponent },
{ path: '**', redirectTo: '' }
];
const SECURE_ROUTES: Routes = [
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' },
{ path: 'dashboard', component: DashboardComponent, canActivate: [ LoggedInGuard ] }
];
const routes: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: '', component: PublicLayoutComponent, children: PUBLIC_ROUTES },
{ path: '', component: SecureLayoutComponent, children: SECURE_ROUTES }
];
Когда URL-адрес /
, в настоящее время 3 маршрута верхнего уровня, которые маршрутизатор будет пытаться сопоставить.
Следует помнить, что порядок, в котором объявлены маршруты, важен. Маршрутизатор проверит их по порядку.
{ path: '', redirectTo: 'home', pathMatch: 'full' }
Одной из проблем в вашем примере является то, что маршрут 'home'
не существует.
На данный момент /home
не существует, поэтому маршрутизатор откатится на следующий маршрут ...
{ path: '', component: PublicLayoutComponent, children: PUBLIC_ROUTES }
Маршрутизатор будет сопоставляться с первым дочерним элементом, где он найдет еще один redirectTo: 'home'
. Затем он вернется к пути '**'
, который перенаправит на ''
. Это сейчас циклический путь. Я подозреваю, что маршрутизатор распознает это и остается на URL /
. Он будет отображать PublicLayoutComponent
без чего-либо для вставки <router-outlet>
.
{ path: '', component: SecureLayoutComponent, children: SECURE_ROUTES }
Маршрутизатор даже не пытался сопоставить этот путь.
Исправление
'**' следует переместить из дочерних маршрутов в маршруты верхнего уровня.
Маршруты верхнего уровня должны быть объявлены в порядке от наиболее специфичных c к наиболее общим.
The LoggedInGuard
следует переместить на маршрут верхнего уровня, чтобы сохранить повторное выделение его на каждом дочернем маршруте.
Также необходимо убедиться, что вы добавили 'home'
маршрут.
const PUBLIC_ROUTES: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'login', component: LoginComponent }
];
const SECURE_ROUTES: Routes = [
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' },
{ path: 'dashboard', component: DashboardComponent }
];
const routes: Routes = [
{ path: '', component: PublicLayoutComponent, children: PUBLIC_ROUTES },
{ path: '', component: SecureLayoutComponent, children: SECURE_ROUTES, canActivate: [ LoggedInGuard ] },
{ path: '**', redirectTo: '' }
];
DEMO : https://stackblitz.com/edit/angular-xzqvcr
Отказ от ответственности: Я не прошел исходный код маршрутизатора. Поэтому я не могу утверждать, что точно знаю, как он решает круговые маршруты. Мой ответ основан на моих наблюдениях в этом сценарии.