【问题标题】:Use mat-input while mat-menu is opened in Material2在 Material2 中打开 mat-menu 时使用 mat-input
【发布时间】:2018-08-02 05:15:40
【问题描述】:

<mat-menu> 用于<mat-form-field> 时,它会从输入中获取焦点。我希望用户能够在打开菜单时使用输入。

这可能吗?

<mat-form-field appearance="outline" [matMenuTriggerFor]="appMenu">
  <mat-label>Label color</mat-label>
  <div class="color-container">
    <div class="color-dot" [style.backgroundColor]="label.color"></div>
  </div>
  <input #input matInput class="pl-2" [(ngModel)]="label.color">
</mat-form-field>


<mat-menu #appMenu="matMenu" yPosition="below" [overlapTrigger]="false">
  <mat-grid-list cols="8" rowHeight="30px">
    <mat-grid-tile *ngFor="let color of colors">
      <div mat-menu-item class="menu-item">
        <div class="color-dot" [style.backgroundColor]="color" 
                               (click)="label.color = color"></div>
      </div>
    </mat-grid-tile>
  </mat-grid-list>
</mat-menu>

stackblitz example

【问题讨论】:

  • 我认为 Luca De Nardi 在下面回答了这个问题。它对我有用。

标签: angular angular-material2


【解决方案1】:

您可以通过添加轻松实现此目的

<mat-menu #myMenu="matMenu">
    <form (click)="stopPropagation($event)">
        <!-- Your content and inputs -->
    </form>
</mat-menu>

在你的组件中

stopPropagation(event){
    event.stopPropagation();
}

这将阻止事件传播,因此打开菜单的按钮不会收到“切换”触发器。

编辑:正如 Jakub 在 cmets 中所说,您也可以跳过函数创建并立即从模板中调用 stopPropagation 方法

  <form (click)="$event.stopPropagation()">

【讨论】:

  • 优秀。就我而言,我使用的是 mat-menu-item 并且能够将 (click)="stopPropagation($event)" 放在那里(而不是在
    中)。谢谢。
  • 为什么要创建 stopPropagation 函数?只需调用 (click)="$event.stopPropagation()" ...。创建更少的依赖项比创建更多的依赖项更好 ....
  • @Jakub 你是对的,我会更新答案。我前段时间做过,如果我现在必须这样做,我会按照你的建议做:)
【解决方案2】:

据我了解,您希望您的输入在垫子菜单之外,处于较低级别,同时打开垫子菜单并使用不同的颜色选项作为参考。如果不是这种情况,您应该将 mat-form-field 标签放在 mat-menu 标签内,如上所述。唯一的事情是我不明白为什么你必须阻止 mat-menu 关闭专注于输入,因为这从来没有发生在我身上,只有当你有输入时使用 tab 键关闭菜单,在这种情况下,您必须捕获 keydown 事件并阻止它,同时也阻止 ESC 键的问题...但是如果您想要的是打开菜单并能够在较低级别的输入上写入同时,您需要做的是禁用垫子菜单的背景。你可以像这样在html上制作它:

<mat-menu #myMenu="matMenu" [hasBackdrop]="false"></mat-menu>

【讨论】:

    【解决方案3】:

    如果您想在菜单打开时输入文本并假设您通过单击颜色项打开菜单(在其上添加光标指针) - 您需要将“matMenuTriggerFor”移动到较低级别的元素:

    <div class="color-container" [matMenuTriggerFor]="appMenu">
        <div class="color-dot" [style.backgroundColor]="label.color"></div>
    </div>
    

    如果您仍然希望它处于顶层 - 这要困难得多(您需要在内部级别开始允许和阻止事件)。

    【讨论】:

    • 我想打开菜单但不想关闭!我只想在菜单打开时输入文本
    • 已编辑 - 我希望它是您所要求的。
    • 不!您尝试在stackblitz.com/edit/… 中进行更改了吗?
    • 是的,它有效。您不能将触发器放在顶部元素上,该元素是代码两部分的包装器。看来您现在更改了代码,所以我的回答是基于您之前的代码。
    • 不,我没有改变任何东西,这不是包装问题!!!菜单在打开时不允许任何其他操作。顺便说一句,你为什么不分叉那个 stackblitz 用你的更改更新它,然后将它添加到你的答案中?
    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 2019-05-26
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2019-06-16
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多