Angular 5 Material多重菜单

时间:2018-07-12 23:55:06

标签: javascript angular angular5 angular-material-5

我对Angular 5还是陌生的,并且刚刚开始学习它。

最近,我一直在尝试使用Angular 5 Material为我的应用程序创建一个包含多个菜单的菜单栏。
鼠标进入时将触发/打开菜单,鼠标离开菜单时将关闭菜单。
我的问题是每当鼠标悬停在第一个菜单上时,它将加载第二个菜单的菜单项。

以下是问题的屏幕截图:
enter image description here

这是我的代码:
mainmenu.component.html

<div>
    <button mat-button [matMenuTriggerFor]="menu1" 
      (mouseenter)="openMyMenu()">Trigger1</button>
    <mat-menu #menu1="matMenu" overlapTrigger="false">
        <span (mouseleave)="closeMyMenu()">
            <button mat-menu-item>Item 1</button>
            <button mat-menu-item>Item 2</button>
        </span>
   </mat-menu>
</div>
<div>
    <button mat-button [matMenuTriggerFor]="menu2"
      (mouseenter)="openMyMenu()">Trigger2</button>
    <mat-menu #menu2="matMenu" overlapTrigger="false">
        <span (mouseleave)="closeMyMenu()">
            <button mat-menu-item>Item 3</button>
            <button mat-menu-item>Item 4</button>
        </span>
    </mat-menu>
</div>



mainmenu.component.ts

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

@Component({
  selector: 'app-mainmenu',
  templateUrl: './mainmenu.component.html',
  styleUrls: ['./mainmenu.component.css']
})
export class MainmenuComponent implements OnInit {
  @ViewChild(MatMenuTrigger) matMenuTrigger: MatMenuTrigger;

  constructor() { }

  ngOnInit() {
  }
  openMyMenu() {
    this.matMenuTrigger.openMenu();

  } 
  closeMyMenu() {
    this.matMenuTrigger.closeMenu();
  }
}

我也尝试过这样做:@ViewChild('menu1') matMenuTrigger: MatMenuTrigger; 但是我遇到了错误。
非常感谢您的意见和建议!


谢谢
阿塔尼斯·泽拉图尔(Artanis Zeratul)

参考文献:


5 个答案:

答案 0 :(得分:5)

我有同样的问题。

创建两个单独的组件,每个组件将包含自己的Mat菜单,而不会影响彼此。

<!-- component1 -->
<div>
 <button mat-button [matMenuTriggerFor]="menu1" 
  (mouseenter)="openMyMenu()">Trigger1</button>
 <mat-menu #menu1="matMenu" overlapTrigger="false">
    <span (mouseleave)="closeMyMenu()">
        <button mat-menu-item>Item 1</button>
        <button mat-menu-item>Item 2</button>
    </span>
</mat-menu>
</div>

<!-- component2 -->
<div>
<button mat-button [matMenuTriggerFor]="menu2"
  (mouseenter)="openMyMenu()">Trigger2</button>
<mat-menu #menu2="matMenu" overlapTrigger="false">
    <span (mouseleave)="closeMyMenu()">
        <button mat-menu-item>Item 3</button>
        <button mat-menu-item>Item 4</button>
    </span>
 </mat-menu>
</div>

答案 1 :(得分:2)

我的工具栏中有两个Matmenus,每个Matmenus是一个单独的组件,并触发一个单独的Matmenu。

查看以下图片:

enter image description here

这是我的通知组件(上图中的组件1) 在我的编辑器视图中:

enter image description here

在我的notifications.component.html文件中:

<button mat-icon-button [matMenuTriggerFor]="notificationsMenu" (mouseover)="openNotifications()">
  <mat-icon class="material-icons ele-text-color-grey">notifications</mat-icon>
</button>

<mat-menu #notificationsMenu="matMenu" [overlapTrigger]="false"></mat-menu>

我认为不可能在一个组件中包含两个组件,但我希望这会有所帮助。

答案 2 :(得分:2)

此问题的正确解决方案:

@ViewChildren(MatMenuTrigger) trigger: QueryList<MatMenuTrigger>;

//And call:

me.trigger.toArray()[indexOfMenu].openMenu();

答案 3 :(得分:2)

此问题与 angular 中的元素引用有关,因此您不能在单个组件中直接使用多个 mat-menu。

要做的技巧是创建一个单独的组件来实现 mat-menu: 例如,

mat-menu.component.html:

`<div>
    <span>
        <a (click)="openSelectMenu()">Menu
        <mat-icon>arrow_drop_down</mat-icon>
        <div #menuTrigger="matMenuTrigger" [matMenuTriggerFor]="menu1"></div>
        </a>
        <mat-menu #menu1="matMenu" overlapTrigger="false">
        <a mat-menu-item *ngFor="let menu of menuItems">{{menu}}</a></mat-menu>
    </span>
</div>`

mat-menu.component.ts

`@ViewChild(MatMenuTrigger) trigger: MatMenuTrigger;`
`menuItems=['1', '2', '3'];`

 `openSelectMenu() {
    this.trigger.openMenu();
 }`

现在您可以在任何组件中多次使用此组件。 例如, app.component.html

`<app-menu></app-menu>
<app-menu></app-menu>`

它会起作用。

答案 4 :(得分:0)

<ul class="navbar-nav ml-auto">
  <li class="nav-item dropdown">
      <button mat-button [matMenuTriggerFor]="admin">ADMIN</button>
      <mat-menu #admin="matMenu">
        <button mat-menu-item>User Management</button>
      </mat-menu>
  </li>
  <li class="nav-item dropdown">
      <button mat-button [matMenuTriggerFor]="profile">PROFILE</button>
      <mat-menu #profile="matMenu">
        <button mat-menu-item>Change Password</button>
        <button mat-menu-item>Logout</button>
      </mat-menu>
  </li>