如何以编程方式打开mat-menu?

时间:2017-11-05 05:16:18

标签: angular typescript angular-material2

我在点击mat-nav-list项目时尝试触发打开菜单。

HTML

<mat-nav-list>
    <mat-list-item (click)="onOpenMenu(menu)" *ngFor="let i of data">
        <div mat-line>
            {{ i.name }}
        </div>
        <p mat-line>
            {{ i.email }}
        </p>
        <button mat-icon-button [matMenuTriggerFor]="menu">
            <mat-icon>more_vert</mat-icon>
        </button>
    </mat-list-item>
    <mat-menu #menu="matMenu">
        <button mat-menu-item>View profile</button>
        <button mat-menu-item>Add contact</button>
    </mat-menu>
</mat-nav-list>

TS

onOpenMenu(menu: any): void {
   // menu doesn't have any openMenu() function 
   // which is of course not a trigger object but a menu itself.
   console.log(menu);
}

我一直试图看看这个更接近我情况的issue on github。但在我的情况下,我有一个动态的项目列表,我想在每次点击时打开一个菜单。

DEMO

2 个答案:

答案 0 :(得分:20)

您需要从MatMenuTrigger元素

获取[matMenuTriggerFor]个实例
#menuTrigger="matMenuTrigger"  [matMenuTriggerFor]="menu"

其中

  • #menuTrigger是模板参考变量

  • matMenuTriggerexportAs元数据的MatMenuTrigger属性

然后简单地调用

(click)="menuTrigger.openMenu()"

<强> Stackblitz example

在此处阅读有关模板参考变量的更多信息

答案 1 :(得分:0)

您还可以直接在代码中控制<mat-menu>。 这是一个示例:

import { Component, ViewChild } from '@angular/core';
import { MatMenuTrigger } from '@angular/material/menu';

...
export class LanguageComponent {
  @ViewChild('languageMenuTrigger') languageMenuTrigger: MatMenuTrigger;
  
  ...

  openMenu() {
    this.languageMenuTrigger.openMenu();
  }
  
  closeMenu() {
    this.languageMenuTrigger.closeMenu();
  }
}
<button
  mat-button
  [matMenuTriggerFor]="languageMenu"
  #languageMenuTrigger="matMenuTrigger">
  Language
  <mat-icon>expand_more</mat-icon>
</button>
<mat-menu #languageMenu="matMenu">
  <button
    mat-menu-item>
    English
  </button>
  <button
    mat-menu-item>
    Français
  </button>
</mat-menu>