如何防止关闭具有 属性 - 鼠标悬停 [隐藏] 的父级内部的垫子菜单?

How to prevent closing of a mat menu which is inside a parent which has property - mouseover [hidden]?

我有一个父包装 class 和一个子 angular material 菜单按钮。当我悬停在父 class 之外时,我需要隐藏整个包装器。但是当我单击父包装器 class 内的按钮(打开垫子菜单)时,整个父级关闭。

我应该能够在父包装内执行任何点击操作,并且只有当我悬停在父包装外时它才会关闭。我该如何实施?

我试过添加

event.stopImmediatePropagation();
event.preventDefault();
event.stopPropagation();

点击子垫菜单的按钮,但父包装器仍在关闭

https://stackblitz.com/edit/angular-ekjzq5

这是我重现我的问题的 stackblitz link。单击菜单按钮时,它应该打开菜单而不是关闭整个父级 div。

我应该可以点击按钮菜单并且应该可以点击菜单中的项目

<button mat-button (mouseover)="showBase=true">Hover on me </button>
<div *ngIf="showBase" class="div-style">
   <span  (mouseleave)="showBase=false">
      <button mat-icon-button [matMenuTriggerFor]="menu" 
      #menuTrigger="matMenuTrigger" >
      <mat-icon>menu</mat-icon>
      </button>
      <mat-menu #menu="matMenu" [overlapTrigger]="false">
      <span>
         <button mat-menu-item>
            <mat-icon>home</mat-icon>
            <span>Home</span>
         </button>
         <button mat-menu-item>
            <mat-icon>people_outline</mat-icon>
            <span>Connecting</span>
         </button>
      </span>
      </mat-menu>
   </span>
</div>

所以,它关闭的原因是因为当您单击按钮打开菜单时 Angular 添加了一些标记(一个是整个屏幕的覆盖),现在位于您的鼠标下方 - 所以您实际上触发了 mouseleavemouseout。因此,您将不得不进行一些更改。但你有选择!

  • 我不确定您使用的是哪个版本,但可以将 hasBackdrop 设置为 false 并完全避免此问题。
  • 您可以通过点击而不是鼠标移动来触发 parent 菜单 open/close。这是最简单的修复方法,但显然可能不是您想要的效果。
  • 使用第二个变量来跟踪菜单是否打开,如果菜单也打开,则保持 parent 打开。这样做的缺点是,当菜单关闭时,您的 parent 也会关闭。 Stackblitz 的更改如下所示:

app.component.ts

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {  
showBase:boolean = false;
menuUp:boolean= false;
}

app.component.html

<mat-toolbar color="primary">
    <span class="fill-remaining-space">
    <button mat-button (mouseover)="showBase=true">Hover on me </button>
    <div *ngIf="showBase||menuUp" class="div-style" (mouseleave)="showBase=false">
     <span> 
       <button mat-icon-button 
       [matMenuTriggerFor]="menu" 
       #menuTrigger="matMenuTrigger"
       (menuOpened)="menuUp=true"
       (menuClosed)="menuUp=false">
      <mat-icon>menu</mat-icon>
    </button>
    <mat-menu #menu="matMenu" [overlapTrigger]="false">
    <span >
      <button mat-menu-item>
        <mat-icon>home</mat-icon>
        <span>Home</span>
      </button>
      <button mat-menu-item>
        <mat-icon>people_outline</mat-icon>
        <span>Connecting</span>
      </button>
      <button mat-menu-item>
        <mat-icon>videocam</mat-icon>
        <span>Let's talk</span>
      </button>
      <button mat-menu-item>
        <mat-icon>exit_to_app</mat-icon>
        <span>Logout</span>
      </button>
    </span>
</mat-menu></span>
</div>

 </span> 
  <span class="fill-remaining-space">Application Title</span>
</mat-toolbar>

您可以通过考虑何时设置 menuUp=false(而不是仅在菜单关闭时)并添加对您的情况有意义的逻辑来解决此问题。

我修改了上面的回复。即使内部菜单关闭,我也不希望基本容器关闭。所以我在下面添加了一个覆盖容器,每当它进入覆盖容器时,我就会关闭基础容器。

这是更新后的 link https://stackblitz.com/edit/angular-yx376k

<mat-toolbar color="primary">
    <span class="fill-remaining-space">
    <button mat-button (mouseover)="showBase=true">Hover on me </button>
    <div class="overlay" style="" (mouseover)="showBase=false;menuUp=false"></div>
    <div *ngIf="showBase||menuUp" class="div-style" (mouseleave)="showBase=false">
     <span> 
       <button mat-icon-button 
       [matMenuTriggerFor]="menu" 
       #menuTrigger="matMenuTrigger"
       (menuOpened)="menuUp=true"
      >
      <mat-icon>menu</mat-icon>
    </button>
    <mat-menu #menu="matMenu" [overlapTrigger]="false">
    <span >
      <button mat-menu-item>
        <mat-icon>home</mat-icon>
        <span>Home</span>
      </button>
      <button mat-menu-item>
        <mat-icon>people_outline</mat-icon>
        <span>Connecting</span>
      </button>
      <button mat-menu-item>
        <mat-icon>videocam</mat-icon>
        <span>Let's talk</span>
      </button>
      <button mat-menu-item>
        <mat-icon>exit_to_app</mat-icon>
        <span>Logout</span>
      </button>
    </span>
</mat-menu></span>
</div>

 </span> 
  <span class="fill-remaining-space">Application Title</span>
</mat-toolbar>