如何在组件中切换 angular material sidenav

How to toggle angular material sidenav in component

如何在组件中调用angular material sidenav 动作?我有一个用例,sidenav 只能在 callMethods() 方法触发时打开/关闭。我也不能简单地在 callMethods() 中传递 open(e)(需要 1 个参数)。有没有办法实现这个?

app.html

<mat-sidenav-container class="example-container">
  <mat-sidenav #sidenav [mode]="mode.value">
    <p>
      some nav here
    </p>
  </mat-sidenav>

  <mat-sidenav-content>
    <p><button mat-button (click)="open(sidenav)">Toggle</button></p>
    <p>
      some text here
    </p>
  </mat-sidenav-content>
</mat-sidenav-container>

app.ts

open(e: any) {
    e.toggle();
  }

  callMethods() {
    this.open(); // required 1 arguments
    this.otherMethod();
  }
anotherMethod() {
    this.open(); // required 1 arguments
    this.otherMethod();
  }

注意:我注意到有一个post但不清楚

通过组件上的 [opened] 参数打开和关闭 angular material 侧边导航的一种干净利落的方式。您可以向它传递一个布尔值,您可以将其操纵到 open/close 侧边导航。

app.html

<mat-sidenav-container class="example-container">
  <mat-sidenav #sidenav [mode]="mode.value" [opened]="isShowing">
    <p>
      some nav here
    </p>
  </mat-sidenav>

  <mat-sidenav-content>
    <p><button mat-button (click)="toggleSidenav()">Toggle</button></p>
    <p>
      some text here
    </p>
  </mat-sidenav-content>
</mat-sidenav-container>

如果按如下方式实现,您的 callMethods 函数就可以干净地调用您的切换方法:

app.ts

isShowing: boolean;

toggleSidenav() {
   this.isShowing = !this.isShowing;
}

callMethods() {
    this.toggleSidenav();
}

 

1) 在您的组件中导入 viewChild。

import { ViewChild } from '@angular/core';

2) 在组件的构造函数之前获取 sidenav 的引用

@ViewChild('sidenav') sidenav;

3) 从方法打开

callMethods() {
  this.open(this.sidenav); // required 1 arguments
  this.otherMethod();
}

我的代码没有太多细节,我直接在 component.ts

中编写了一个自定义方法

为了避免未定义的问题,我首先声明 isShowing = false 在页面构建时自动隐藏它,但这取决于你。

在component.ts

toggle(): boolean{
    if (!this.isShowing){
        return this.isShowing = true;
    }
    else{
        return this.isShowing = false;
    }
}

在component.html中:

<mat-drawer [opened]="isShowing"></mat-drawer>

这非常有效,还允许为函数 toggle() 提供参数以注入数据,因此您可以根据上下文使用一些参数自定义导航内容。

我的方式

  1. 使用@Output()

     <mat-sidenav #sidenav ></mat-sidenav>
     <app-header (toggleMenuEvent)="sidenav.toggle()"></app-header>
    
  2. 和 EventEmmiter

     export class HeaderComponent implements OnInit {
    
     @Output() toggleMenuEvent = new EventEmitter<void>();    
    
     constructor() { }
    
     ngOnInit(): void {
     }
    
     public toggleMenu() {
         this.toggleMenuEvent.emit();
     }