首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在另一个组件中切换mat-sidenav?

如何在另一个组件中切换mat-sidenav?
EN

Stack Overflow用户
提问于 2019-05-29 17:44:11
回答 3查看 3K关注 0票数 0

我想通过单击菜单图标(在header组件中)来切换side-nav(在抽屉组件中)。我尝试过使用服务;但这两个组件之间没有共享服务状态。

演示在这里https://stackblitz.com/edit/angular-11pdkj

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-29 18:57:24

Angular提供了非常强大的Input, Output概念。请考虑使用Input, Output and EventEmitter,您可以将事件从一个组件反弹到另一个组件。

请看一下这张demo link

代码语言:javascript
复制
// drawer.component.ts
export class DrawerComponent implements AfterViewInit, OnChanges {
  @ViewChild('sidenav') public sidenav: MatSidenav;

  @Input()
  openNav: boolean;

  ngOnChanges(): void {
    console.log('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.log('navOpen', $event);
  }
}

如果需要,也可以使用相应的组件生命周期挂钩。

票数 0
EN

Stack Overflow用户

发布于 2019-05-29 19:10:58

您应该使用@Input@Output装饰器以及EventEmitter将事件从一个组件发送到另一个组件。我已经修复了你的代码,请查看:stackblitz

票数 1
EN

Stack Overflow用户

发布于 2019-05-29 19:15:58

我没有在服务中设置sidenav,而是在sidenav需要切换时将服务转换为通知程序,从而解决了这个问题。因此,当你点击这个按钮时,服务会告诉一个行为主体发出它对DrawerComponent的更改。此组件订阅ngOnInit中的behaviour主题。并且当服务向组件通知切换时切换sidenav。

下面的StackBlitz展示了我是如何修复代码的:https://stackblitz.com/edit/angular-mgm4xn

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56357598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档