Как переключить мат-сиденав в другой компонент?

Я хочу переключить боковую навигацию (в компоненте ящика), щелкнув значок меню (в компоненте заголовка). Я пытался использовать сервис; но состояние службы не разделялось между этими двумя компонентами.

Демо здесь https://stackblitz.com/edit/angular-11pdkj

Проблема возникла из-за того, что этот vscode не проверял закрывающий тег html, и Angular также не проверял эту ошибку в шаблоне.

phaneven 24.07.2019 05:08
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
3 456
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Другие вопросы по теме

Похожие вопросы