我目前正在开发一个表格,用户可以通过按enter键在可编辑元素中进行制表.我在这张照片中也使用了棱角material .

我有一个mat form字段,其中有几个使用mat autocomplete元素动态创建的输入字段.然而,我的enter key事件在这方面的行为有点不同.

当你按下输入栏时,会打开一个面板(下拉),用户可以在其中 Select 输入,也可以自己写,面板会给出建议(自动完成).

What happens if you press the tab key?

如果在键入时按tab键,光标将移动到下一个可编辑元素上,最新元素的面板(下拉菜单)将关闭.

What happens if you press the enter key

如果在键入时按enter键,光标将移动到下一个可编辑元素上,但最新元素的面板(下拉列表)保持打开状态,这会导致多个输入字段有一个打开的下拉面板,即使用户已经编写了所需的内容.

模板:

<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>

这只是基于数组中对象的数量创建行(这里不太重要).

还有一个 keys .在输入字段上输入事件,当用户在焦点位于输入字段时按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.autocompleteMatAutocomplete类的对象.我通过写作补充了这一点

@Input('matAutocomplete')
autocomplete: MatAutocomplete

What I need:

我希望mat autocomplete元素的下拉面板在按enter键后关闭.

提前谢谢!

Update:

工作了一段时间后,我发现了这个

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

+

this.test.closePanel();

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

推荐答案

我的用例有slightly种不同,所以你的更新对我来说不起作用,但我找到了slightly种不同的解决方案:

@ViewChild(MatAutocompleteTrigger) autocomplete: MatAutocompleteTrigger;

然后可以使用此选项关闭下拉选项:

this.autocomplete.closePanel(); 

确保同时导入ViewChild:

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

很有魅力.

Typescript相关问答推荐

TS 2339:属性切片不存在于类型DeliverableSignal产品[]上>'

如何防止TypeScript允许重新分配NTFS?

如何创建泛型类型组件来使用React Native的FlatList或SectionList?'

如何在使用`Next—intl`和`next/link`时导航

键集分页顺序/时间戳上的筛选器,精度不相同

为什么我的Set-Cookie在我执行下一次请求后被擦除

缩小并集子键后重新构造类型

诡异的文字类型--S为物语的关键

返回嵌套props 的可变元组

如何在使用条件类型时使用void

使用泛型识别对象值类型

界面中数组中的混合类型导致打字错误

将超类型断言为类型脚本中的泛型参数

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

如何静态键入返回数组1到n的函数

在REACT查询中获取未定义的isLoading态

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

获取类属性的类型';TypeScript中的getter/setter

如何向我的自定义样式组件声明 custom.d.ts ?

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'