Я хочу переключить боковую навигацию (в компоненте ящика), щелкнув значок меню (в компоненте заголовка). Я пытался использовать сервис; но состояние службы не разделялось между этими двумя компонентами.
Демо здесь https://stackblitz.com/edit/angular-11pdkj
Angular предоставляет очень мощную концепцию Input, Output
.
Пожалуйста, рассмотрите возможность использования Input, Output and EventEmitter
с этим всем вы можете перенаправить событие от одного компонента к другому компоненту.
Пожалуйста, взгляните на этот демонстрационная ссылка.
// drawer.component.ts
export class DrawerComponent implements AfterViewInit, OnChanges {
@ViewChild('sidenav') public sidenav: MatSidenav;
@Input()
openNav: boolean;
ngOnChanges(): void {
console.info('ngOnChanges', this.openNav);
if (this.openNav) {
this.sidenav.open();
} else {
this.sidenav.close();
}
}
}
// header.component.ts
export class HeaderComponent implements OnInit {
title: string = "Dashboard";
@Output()
open: EventEmitter<boolean> = new EventEmitter();
clickMenu() {
this.open.emit(true);
}
}
// layouts.component.html
<div class = "app-wrapper">
<app-drawer [openNav] = "isOpen"></app-drawer>
<app-header (open) = "navOpen($event)"></app-header>
<div>
// layouts.component.ts
export class LayoutsComponent implements OnInit {
isOpen: boolean;
navOpen($event): void {
this.isOpen = !this.isOpen;
console.info('navOpen', $event);
}
}
также используйте соответствующие хуки жизненного цикла компонентов, когда это необходимо.
Вы должны использовать декораторы @Input
и @Output
и EventEmitter
для отправки события из одного компонента в другой.
Я исправил ваш код,
Пожалуйста, проверьте это:
стекблиц
Я решил эту проблему, не устанавливая sidenav в сервисе, а превратив сервис в уведомитель, когда sidenav нужно переключать. Поэтому, когда вы нажимаете кнопку, служба сообщает субъекту поведения, чтобы он передал его изменение в DrawerComponent. Этот компонент подписывается на тему поведения в файле ngOnInit. И переключает sidenav, когда служба уведомляет компонент о переключении.
Следующий StackBlitz показывает, как я исправил ваш код: https://stackblitz.com/edit/angular-mgm4xn
Проблема возникла из-за того, что этот vscode не проверял закрывающий тег html, и Angular также не проверял эту ошибку в шаблоне.