以下是实现这一目标的最佳优化方式,无需对现有组件代码进行太多更改,并且其他组件也更容易启用侧边栏。
配置你的路由器:
{
path: "home",
component: HomeComponent,
canActivate: [AuthGuard],
data: { sidebar: true }
},
创建一个 SidebarService 来保存/更新特定于路由的值
@Injectable({
providedIn: "root"
})
export class SidebarService {
private showSidebar$ = new BehaviorSubject<Boolean>(false);
constructor() { }
setValue(value: boolean) {
this.showSidebar$.next(value);
}
getValue() {
this.showSidebar$.value;
}
getValue$() {
this.showSidebar$.asObservable;
}
}
现在在你的 AuthGuard 中
@Injectable({
providedIn: "root"
})
export class AuthGuard implements CanActivate, CanActivateChild, CanDeactivate<any> {
constructor(private router: Router,
private sidebarService : SidebarService ) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const showSidebar = route["data"]["sidebar] || false;
this.sidebarService.setValue(showSidebar );
}
}
现在在选择器中添加 *ngIf 并注入 SidebarService
组件中的服务。
在组件中
constructor(private sidebarService : SidebarService ) { }
get showSideBar(){
return this.sidebarService.getValue$();
}
在 HTML 中
<app-sidebar *ngIf="showSideBar | async"></app-sidebar> // Use either async pipe or you can have a variable and updating its value by subscribing to this.sidebarService.getValue$()
现在你只需要添加
data: { sidebar: true }
在您要启用侧边栏的路线中。这是我所知道的最佳优化方式,也可能对您有用。