【问题标题】:How to display mat-menu after entering 3 characters in input field?在输入字段中输入 3 个字符后如何显示 mat-menu?
【发布时间】:2021-03-25 18:30:55
【问题描述】:

我正在实现这个输入字段,这样当我输入 3 个字符时,我想将 mat-menu 显示为 mat-option 的值,但由于某种原因,mat-menu 永远不会显示。谁能指出我正确的方向?提前非常感谢!

这里是LIVE DEMO

<mat-autocomplete #auto="matAutocomplete">
    <mat-option *ngIf="isSpinnerLoading">

  <div *ngIf="!menuContent">Loading...</div>
  <div *ngIf="menuContent">
    show menu

    <mat-menu #menu="matMenu" class="menu-select">
            <div (click)="$event.stopPropagation()">
                <div *ngFor="let item of myList">
                    <mat-checkbox
                        class="mat-menu-item">
                        {{item}}
                    </mat-checkbox>
                </div>
            </div>
        </mat-menu>
  </div>
    </mat-option>
</mat-autocomplete>

这就是我想要完成的:

【问题讨论】:

  • 你为什么在 mat-option 中使用 mat-menu ?
  • @IsmailDinar 我刚刚更新了我的问题,显示了我想要完成的任务。我正在尝试在 mat-option 中添加 mat-menu,以便以后可以使用 mat-autocomplete
  • 用户可以选择多个选项?
  • @IsmailDinar 是的,用户可以选择多个选项

标签: javascript angular typescript angular-material


【解决方案1】:

问题

您面临的问题是您的内容打开时没有触发mat-menuopenMenu()函数

解决方案

我们需要一种方法来触发菜单打开 以下是我使用过的一种方法

在您的 html 中添加以下标记

<span #menuTrigger="matMenuTrigger"  [matMenuTriggerFor]="menu">show menu</span>

在您的 TS 文件下面添加 @ViewChild 属性以保存 matMenuTrigger

  @ViewChild("menuTrigger", { static: false }) set menuTrigger(
    content: MatMenuTrigger
  ) {
    if (content) {
      this.contentPlaceholder = content;
    }
  }

最后修改你的onKeyUp()函数

  onKeyUp() {
    if (this.currentText.length >= 3) {
      console.log("testing");
      this.isSpinnerLoading = true;
      this.menuContent = false;
      setTimeout(() => {
        this.menuContent = true;
      }, 2000);
      setTimeout(() => {
        this.contentPlaceholder.openMenu();
      }, 2001);
    } else {
      this.isSpinnerLoading = false;
    }
  }

请注意,我们在this.menuContent() 变为真后触发openMenu()

See Demo

【讨论】:

    【解决方案2】:
    1. 不需要使用mat-menu,可以使用mat-checkbox作为选项。
    2. ngFor 必须在 mat-option 元素上使用,否则,在当前实现中,您最终将得到一个选项。
    3. 加载指示器 (Loading...) 可以显示为禁用的垫选项。
    4. 为了启用多项选择,该项目应该是一个具有布尔值的对象,该布尔值指示该项目是否被选中。

    这是 stackblitz 的 link。它并不完美,但可以提供帮助。

    【讨论】:

    • 您只需要在 auto="matAutocomplete" 之前添加 # 就可以了。
    • @Devmix 我已经更新了 stackblitz 示例。
    • 作为一项要求,我需要使用 mat-menu 而您的答案没有使用它
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多