angular - Angular:cdk-virtual-scroll + 自动完成 - cdk-overlay-pane 问题
问题描述
我正在使用带有 mat-autocomplete 的 Angular CDK 的覆盖模块。
场景: 有一个带有cdk-virtual-scroll的mat-autocomplete输入框,下面有两个按钮。使用下拉列表中的值之一预先选择了输入框。
问题: 现在,如果我们从 mat-autocomplete 输入中选择整个文本/双击默认选定的文本,然后点击正下方以再次取消选择该文本(在该按钮上/上方),我将无法单击这些按钮。
调试时分析: 如果我们点击输入,它会打开透明的 cdk-overlay 层,但没有结果。供参考,请参阅随附的 img,以了解我已将叠加背景设置为黄色,因为此叠加我们无法单击按钮。
<span>
<mat-form-field class="view-field">
<input matInput #leftInput
type="text"
placeholder="Select option"
[formControl]="viewControl"
[matAutocomplete]="view"
(blur)="checkData(true, viewControl.value)"
(click)="leftInput.select()"/>
</mat-form-field>
<mat-autocomplete
[displayWith]="display()"
(optionSelected)="checkData(true, $event.option.value)"
#view="matAutocomplete">
<cdk-virtual-scroll-viewport class="auto-complete-viewport" itemSize="10" minBufferPx="500" maxBufferPx="750">
<mat-option
*cdkVirtualFor="let d of data | async"
[value]="d"
title="{{ getNames(backup) }}">
{{ getNames(backup) }}
</mat-option>
</cdk-virtual-scroll-viewport>
</mat-autocomplete>
</span>
解决方案
我认为这可能是 cdk-overlay-panepointer-events
设置为auto
,并且当窗格在输入焦点上生成时,它甚至在您开始获得结果之前就已经存在。
我有一个解决方案,但是我很想知道您是否找到了更好的方法,因为尽管它有效,但它不是最理想的解决方案。
HTML:
- 在 HTML 元素中的输入元素上使用
(focus)="onFocus"
. - 在 mat-autocomplete 元素上,用于
(click)="$event.stopPropagation()"
禁用点击。
打字稿:
- 然后以下函数将找到生成的叠加层并将其更改
pointer-events
为none
.
onFocus() {
setTimeout(() => {
if (document.getElementsByClassName('cdk-overlay-pane')[0]) {
const overlay = <HTMLElement>document.getElementsByClassName('cdk-overlay-pane')[0];
overlay.style.pointerEvents = 'none';
}
}, 0);
}
推荐阅读
- r - 根据优先级分配资源
- java - 如何像android时钟应用程序一样自动更改应用程序图标?
- c++ - 在资源管理器中保持加载 DLL 模块,直到 COM 类被销毁
- javascript - 合并函数返回到 bbject:Spread vs Object.assign
- javascript - 循环点击后如何获取卡值
- c# - .Net Core - 发布到 Ubuntu 平台后的 Mailkit SSLHandshake 错误
- discord.py - @client.event 忽略 @client.command()
- java - 子组件未通过 onConfigure 更新下拉选择
- types - 使用宏函数的 SAS 类型问题
- kotlin-native - Kotlin-Native CompileKotlinIos 任务失败,因为当我更改 Objective-C 代码时 Cinterop 任务无法更新