角度材料自动完成 - 如何防止键盘输入以在建议面板中选择一个选项

Posted

技术标签:

【中文标题】角度材料自动完成 - 如何防止键盘输入以在建议面板中选择一个选项【英文标题】:angular material autocomplete - how to prevent keyboard enter to select an option in the suggestion panel 【发布时间】:2019-12-13 00:02:13 【问题描述】:

我希望能够在通过箭头键选择活动选项时按下回车键时实现材料自动完成的自定义输入行为。

目前我有一个指令 (preventEnterDirective) 绑定到 matAutocomplete 所在的相同输入元素。当 keydown.enter 发出时,我会阻止默认设置。但是当 keydown.enter 发出时,选择已经完成。

<input preventEnterDirective type="text" [matAutocomplete]="auto" [formControl]="searchInputControl" type="text">
@HostListener('keydown.enter', ['$event']) public onEnter(evt: KeyboardEvent) 
    evt.preventDefault();


编辑

这是一个stackblitz repo

https://stackblitz.com/edit/angular-txehk4-sic3ej

编辑 2

我对 angular 的 autocomplete 指令的源代码进行了更深入的挖掘,并在 autocomplete-trigger.ts 的第 379 行找到了这个

  _handleKeydown(event: KeyboardEvent): void 
    const keyCode = event.keyCode;
    ...
    if (this.activeOption && keyCode === ENTER && this.panelOpen) 
      this.activeOption._selectViaInteraction();
      this._resetActiveItem();
      event.preventDefault();
     else if (this.autocomplete) 
      const prevActiveItem = this.autocomplete._keyManager.activeItem;
      const isArrowKey = keyCode === UP_ARROW || keyCode === DOWN_ARROW;

      if (this.panelOpen || keyCode === TAB) 
        this.autocomplete._keyManager.onKeydown(event);
       else if (isArrowKey && this._canOpen()) 
        this.openPanel();
      

      if (isArrowKey || this.autocomplete._keyManager.activeItem !== prevActiveItem) 
        this._scrollToOption();
      
    
  

所以基本上我有两个不同的指令,它们绑定到一个输入元素并调用了带有 preventDefault() 的侦听器。

【问题讨论】:

您是否在您的@HostListener 中尝试过return false 是的,我开始怀疑,输入提交不是在输入元素上触发,而是在自动完成组件创建的其他 dom 元素上触发 那么您需要将@HostListener 放入组件中,每次收到事件时,您需要检查event.target 是否与您的自动完成元素匹配然后return false 请同样创建一个Stackblitz项目,大家很容易解决这个问题并回答你。 你需要 stopPropagation() 【参考方案1】:

请从您的stackblitz 代码中删除您的代码autoActiveFirstOption="true",它肯定会起作用。

【讨论】:

不...我已经在 EDIT 2 中发布了可能是源问题。 它 (autoActiveFirstOption="true") 总是将第一个选项设置为活动项目,所以无论何时按下回车键它总是(并且它总是选择第一个项目)。我认为没有其他选择。 你有没有在分叉堆栈闪电战中尝试过你的方法:) 是的!你有吗? @韩车 好吧,我想我不够精确。对此感到抱歉。在我通过箭头键选择了一个活动选项之后,我想在按下回车键时实现自定义回车行为。

以上是关于角度材料自动完成 - 如何防止键盘输入以在建议面板中选择一个选项的主要内容,如果未能解决你的问题,请参考以下文章

如何防止浏览器列出输入字段的建议(不一定与禁用自动完成/自动填充相同)?

角度材料自动完成力选择不起作用

角度材料数据表 - 如何为具有提前类型/自动完成搜索的列设置 filterPredicate?

材料角度自动完成:选择选项后如何在屏幕中保留垫子选项?

如何使用 CdkScrollable 检测角度材料 2 自动完成列表上的滚动事件

如何在角度材料 2 中使用 mat-chip 和自动完成来保存选定的对象