如何在鼠标悬停时显示角材料下拉菜单?

PGH*_*PGH 5 angular-material angular angular7

现在点击汉堡菜单我得到下拉列表而不是我需要它在鼠标悬停在汉堡菜单上这里是堆栈闪电战链接

在此处输入图片说明

Ami*_*ani 20

您可以使用matMenuTrigger指令执行此操作

<button mat-icon-button [matMenuTriggerFor]="menu" 
    #menuTrigger="matMenuTrigger" (mouseenter)="menuTrigger.openMenu()">
Run Code Online (Sandbox Code Playgroud)

要隐藏菜单,请为菜单添加mouseleave事件。

将所有菜单项捆绑在一个spandiv标签中。然后将(mouseleave)事件附加到它

<mat-menu #menu="matMenu" [overlapTrigger]="false">
    <span (mouseleave)="menuTrigger.closeMenu()">
      <button mat-menu-item>
        <mat-icon>home</mat-icon>
        <span>Home</span>
        ........
       <mat-icon>exit_to_app</mat-icon>
       <span>Logout</span>
     </button>
    </span>
</mat-menu>
Run Code Online (Sandbox Code Playgroud)

分叉演示

  • 这应该是 StackOverflow 中的第一个链接 (2认同)

Rua*_*uan 6

我知道我参加聚会已经很晚了,但以上这些都没有真正对我有用。我最终写了一个指令,所以为我解决这个问题。

HoverDropDown指令

import { NgModule } from '@angular/core';
import { Directive, Input, ElementRef, OnInit } from '@angular/core';
import { MatMenuTrigger, _MatMenu } from '@angular/material';

@Directive({
    selector: '[hoverDropDown]'
})
export class HoverDropDownDirective implements OnInit {
    isInHoverBlock = false;

    constructor(private el: ElementRef) {}

    @Input() hoverTrigger: MatMenuTrigger;
    @Input() menu: any;

    ngOnInit() {
        this.el.nativeElement.addEventListener('mouseenter', () => {
            this.setHoverState(true);
            this.hoverTrigger.openMenu();

            const openMenu = document.querySelector(`.mat-menu-after.${this.menu._elementRef.nativeElement.className}`);
            if (!openMenu) {
                this.hoverTrigger.closeMenu();
                return;
            }
            openMenu.addEventListener('mouseenter', () => {
                this.setHoverState(true);
            });
            openMenu.addEventListener('mouseleave', () => {
                this.setHoverState(false);
            });
        });
        this.el.nativeElement.addEventListener('mouseleave', () => {
            this.setHoverState(false);
        });
    }

    private setHoverState(isInBlock: boolean) {
        this.isInHoverBlock = isInBlock;
        if (!isInBlock) {
            this.checkHover();
        }
    }

    private checkHover() {
        setTimeout(() => {
            if (!this.isInHoverBlock && this.hoverTrigger.menuOpen) {
                this.hoverTrigger.closeMenu();
            }
        }, 50);
    }
}

@NgModule({
    declarations: [
        HoverDropDownDirective
    ],
    exports: [
        HoverDropDownDirective
    ]
})
export class HoverDropDownDirectiveModule {}
Run Code Online (Sandbox Code Playgroud)

应用程序模块

import { HoverDropDownDirectiveModule } from '../../directives/hover-drop-down.directive';

imports: [
    HoverDropDownDirectiveModule
]
Run Code Online (Sandbox Code Playgroud)

超文本标记语言

<div *ngFor="let category of categories">
    <button #menuTrigger="matMenuTrigger"
            mat-button
            [matMenuTriggerFor]="children"
            (click)="navigateMain(category.Category)"

            hoverDropDown
            [menu]="children"
            [hoverTrigger]="menuTrigger">
             {{category.Category.Description}}
    </button>
    <mat-menu #children="matMenu" hasBackdrop="false">
        <button mat-menu-item *ngFor="let sub of category.SubCategories" (click)="navigateSubCategory(sub)">{{sub.Description}}</button>
    </mat-menu>
</div>
Run Code Online (Sandbox Code Playgroud)

有2点需要注意:

  1. 主按钮中的 3 个属性(“hoverDropDown”、“[menu]”和“[hoverTrigger]”)
  2. hasBackdrop="false"mat 菜单中的属性

hasBackdrop="false"属性记录在Angular Material中。希望这对你有用......