Вместо того, чтобы показывать или скрывать панель инструментов на основе текущего URL, я бы вместо этого структурировал ваши маршруты и использовал компоненты макета.
authenticated-layout.component. html
<app-toolbar></app-toolbar>
<router-outlet></router-outlet>
anonymous-layout.component. html
<router-outlet></router-outlet>
Вы можете наследовать эти макеты (и средства проверки подлинности) с помощью дочерних маршрутов.
route.ts
const routes: Routes = [
{ path: '', component: AuthenticatedLayoutComponent, canActivate : [ AuthGuardService ],
children: [
{ path: '', redirectTo: '/cards', pathMatch: 'full' },
{ path: 'shareditems', component: ShareditemsComponent },
{ path: 'home', component: AppCardsComponent },
{ path: 'calendar', component: CalendarComponent },
{ path: 'lan', component: LanComponent },
{ path:'nav', component: CommonComponent }
] },
{ path: '', component: AnonymousLayoutComponent, children: [
{ path:'login', component: LoginComponent},
{ path: 'register', component: RegisterComponent },
] }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
DEMO: https://stackblitz.com/edit/angular-jzmw3d
Альтернатива
В конечном итоге, ваша логика c - это то, что вы хотите показывать панель навигации только тогда, когда пользователь вошел в систему. Вы можете настроить видимость через подписку на службу аутентификации.
app.component.ts
export class AppComponent implements OnInit {
isLoggedIn$: Observable<boolean>;
isShowNavbar: boolean;
constructor(private auth: AuthorizationService,private router: Router) {}
private destroyed$ = new Subject();
ngOnInit() {
this.isLoggedIn$ = this.auth.IsLoggedIn;
this.isLoggedIn$.pipe(
takeUntil(this.destroyed$)
).subscribe(isLoggedIn => {
this.isShowNavbar = isLoggedIn;
});
}
ngOnDestroy() {
this.destroyed$.next();
this.destroyed$.complete();
}
}
Я бы по-прежнему рекомендовал использовать дочерние маршруты с одним auth guard в родительском.
Кроме того, я рекомендую вернуть UrlTree
из canActivate
, если вы хотите указать маршрутизатору для перехода к новому маршруту.
auth-guard.service.ts
canActivate (next: ActivatedRouteSnapshot, state: RouterStateSnapshot
): Promise<boolean | UrlTree> {
return this.auth.isAuthenticated()
.then(data => {
return Promise.resolve(true);
}).catch(err => {
const urlTree = this._router.parseUrl('/login');
return Promise.resolve(urlTree);
});
};
}