You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Material 5双菜单切换需双击:如何实现直接打开?

解决Angular Material 5多菜单需双击打开的问题

问题原因

Angular Material菜单组件的默认行为是:点击非当前已打开菜单的触发器时,只会关闭已打开的菜单,不会自动触发新菜单的打开,因此需要两次点击才能完成菜单切换。

解决方案

通过手动控制菜单触发器的状态,实现一次点击直接切换到目标菜单:

  1. 修改模板代码:为两个菜单触发器添加模板引用变量,给第二个触发器绑定点击事件并传入触发器引用:
<div style="display: flex; justify-content: space-between">
  <!-- First menu -->
  <div class="col-xs-6">
    <button mat-icon-button [matMenuTriggerFor]="menu" #trigger1="matMenuTrigger">
      <mat-icon>more_vert</mat-icon>
    </button>

    <mat-menu #menu="matMenu">
      <button mat-menu-item>
        <mat-icon>dialpad</mat-icon>
        <span>Redial</span>
      </button>
      <button mat-menu-item disabled>
        <mat-icon>voicemail</mat-icon>
        <span>Check voicemail</span>
      </button>
      <button mat-menu-item>
        <mat-icon>notifications_off</mat-icon>
        <span>Disable alerts</span>
      </button>
    </mat-menu>
  </div>
  <div class="col-xs-6">
    <!-- Second menu -->
    <button mat-icon-button [matMenuTriggerFor]="menu2" #trigger2="matMenuTrigger" (click)="switchMenu(trigger2, trigger1)">
      <mat-icon>more_vert</mat-icon>
    </button>

    <mat-menu #menu2="matMenu">
      <button mat-menu-item>
        <mat-icon>dialpad</mat-icon>
        <span>Redial</span>
      </button>
      <button mat-menu-item disabled>
        <mat-icon>voicemail</mat-icon>
        <span>Check voicemail</span>
      </button>
      <button mat-menu-item>
        <mat-icon>notifications_off</mat-icon>
        <span>Disable alerts</span>
      </button>
    </mat-menu>
  </div>
</div>
  1. 组件类添加切换逻辑:导入MatMenuTrigger,实现菜单切换方法:
import { Component } from '@angular/core';
import { MatMenuTrigger } from '@angular/material/menu';

@Component({
  selector: 'menu-icons-example',
  templateUrl: 'menu-icons-example.html',
  styleUrls: ['menu-icons-example.css'],
})
export class MenuIconsExample {
  switchMenu(targetTrigger: MatMenuTrigger, otherTrigger: MatMenuTrigger): void {
    // 若另一个菜单处于打开状态,先关闭它
    if (otherTrigger.menuOpen) {
      otherTrigger.closeMenu();
    }
    // 打开目标菜单
    targetTrigger.openMenu();
  }
}

扩展说明

如果需要支持更多数量的菜单,可以维护一个所有触发器的数组,点击时遍历关闭其他已打开的菜单,再打开当前目标菜单,逻辑类似。

内容的提问来源于stack exchange,提问作者DEV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:55:30