javascript - Angular Material : Hide Autocomplete Panel when User hits enter Key

标签 javascript angular typescript frontend angular-material2

我目前正在开发一个表格,用户可以通过按 Enter 键在可编辑元素中切换。我也在其中使用了 Angular Material。

我有一个 mat-form-field,其中包含几个动态创建的输入字段和 mat-autocomplete 元素。然而,我的输入键事件在这方面有点不同。

当您按下输入字段时,将打开一个面板(下拉菜单),用户可以在其中选择输入或者他可以简单地自己编写,面板将提供建议(自动完成)。

如果按 Tab 键会发生什么?

如果您在键入时按 Tab 键,光标将移动到下一个可编辑元素,并且最新元素的面板(下拉列表)将关闭。

如果你按下回车键会发生什么

如果您在键入时按回车键,光标将移动到下一个可编辑元素,但是最新元素的面板(下拉列表)保持打开状态,这会导致多个输入字段具有打开的下拉面板,即使用户已经输入他需要什么。

模板:

<tr *ngFor="let row of rows; let rowIdx = index">
            <td *ngFor="let col of columns; let colIdx = index">
                <mat-form-field class="example-full-width">             
                <input  #inputs type="text" placeholder="Pick one" aria-label="Number" matInput [formControl]="myControl" [matAutocomplete]="auto"
                    (keyup.enter)="shiftFocusEnter(rowIdx, colIdx)">
                    <mat-autocomplete #auto="matAutocomplete">
                            <mat-option *ngFor="let option of filteredOptions | async" [value]="option">
                            {{ option }}
                            </mat-option>
                        </mat-autocomplete>
                    </mat-form-field>
            </td>
      </tr>

这只是根据数组中对象的数量创建行(这里不是很重要)。

输入字段上还有一个 keyup.enter 事件,当用户在焦点位于输入字段上时按下回车键并传递行索引和列索引以获取下一个可编辑元素时,该事件就会被触发。

组件:

shiftFocusEnter(rowIdx: number, colIdx: number) {
console.log("Enter", rowIdx, colIdx);  
if(colIdx == 4 && rowIdx == 5) {
  console.log("Reached end of row");
}
else {
  colIdx = colIdx + this.columns.findIndex(c => c.editable);
  this.autocomplete.showPanel = false;
  this.focusInput(rowIdx, colIdx);
}

这个函数接收两个参数。行索引和列索引并计算下一个可编辑元素的索引以关注该元素。

this.autocomplete.showPanel = false 这行是为了看看我是否可以像这样简单地关闭面板,但它没有用。

this.autocomplete 是类 MatAutocomplete 的对象。我通过写

添加了这个
@Input('matAutocomplete')
autocomplete: MatAutocomplete

我需要什么:

我希望 mat 自动完成元素的下拉面板在按下 enter 后关闭。

提前致谢!

更新:

所以在工作了一下之后我发现了这个

@ViewChild('test', { read: MatAutocompleteTrigger }) test: MatAutocompleteTrigger;

+

this.test.closePanel();

这次我可以关闭表格中第一个单元格的面板,但是其他输入字段的所有面板都将保持打开状态

最佳答案

我的用例略有不同,因此您的更新对我不起作用,但我找到了一个略有不同的解决方案来解决问题:

@ViewChild(MatAutocompleteTrigger) autocomplete: MatAutocompleteTrigger;

然后您可以使用它来关闭下拉选项:

this.autocomplete.closePanel(); 

确保同时导入 ViewChild:

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

像魅力一样工作。

关于javascript - Angular Material : Hide Autocomplete Panel when User hits enter Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48397757/

相关文章:

javascript - AngularJS:如何显示嵌套对象?

JavaScript:深度复制循环 JSON

javascript - imacros javascript 条件 eval 语句

javascript - Angular 2自定义复合控件

reactjs - 如何在 react 排序树的特定节点中添加按钮

javascript - 从对象中获取最大的键

javascript - 如何通过单击按钮更改选中的下一个单选按钮?

如果通过具有绑定(bind)的动态组件插入多个 DOM 元素,Angular 会滞后性能

angular - 属性 "usb"在 angular2 typescript 项目中的类型 "Navigator"上不存在

angular - 如何在 Typescript 中动态禁用或启用 ng-multiselect-dropdown