У меня есть приложение Angular2 с одной розеткой маршрутизатора, в которой отображаются разные компоненты, в зависимости от того, какая ссылка нажата в боковом меню.
Разметка для основного компонента, содержащего <router-outlet>
, выглядит следующим образом:
<div *ngIf="authenticated == false">
<app-login></app-login>
</div>
<div *ngIf="authenticated">
<div class="page home-page">
<header class="header">
<app-navbar></app-navbar>
</header>
<div class="page-content d-flex align-items-stretch">
<div class="sidebar-container">
<app-sidebar-menu></app-sidebar-menu>
</div>
<div class="content-inner">
<app-page-header></app-page-header>
<div id="sub-content">
<router-outlet></router-outlet>
</div>
<app-footer></app-footer>
</div>
</div>
</div>
</div>
Если я нажму ссылку Demo, демонстрационный компонент будет визуализирован, но если я затем перейду по ссылке "Главная", домашний компонент будет отображаться над демо-компонентом в DOM. Щелчок по ним несколько раз приведет к DOM, подобному этому
<div _ngcontent-c0="" id="sub-content">
<router-outlet _ngcontent-c0=""></router-outlet>
<app-home _nghost-c6="">...</app-home>
<app-demo _nghost-c7="">...</app-demo>
<app-home _nghost-c6="">...</app-home> <!-- Why so many here? Should be just either one <app-home> or <app-demo> -->
<app-demo _nghost-c7="">...</app-demo>
<app-home _nghost-c6="">...</app-home>
<app-demo _nghost-c7="">...</app-demo>
<app-footer _ngcontent-c0="" _nghost-c5="">...</app-footer>
</div>
Маршруты определяются как
export const router: Routes = [
{ path: 'demo', component: DemoComponent, canActivate: [AuthGuard] },
{ path: 'home', component: HomeComponent, canActivate: [AuthGuard] }
]
Как получилось, что <router-outlet>
не заменяет компонент, а вместо этого добавляет еще один "экземпляр" компонента при переходе между маршрутами?