我这里出了点状况我需要帮助。目前正在开发一个搜索自动完成功能,其中选项显示在组件中的预定义列表中。现在,我的p-autocomplete标签看起来是这样的:
<p-autoComplete [(ngModel)]="skills" [suggestions]="filteredSkillSuggestions"
id="skills" name="skills" #skillList="ngModel"
(completeMethod)="search($event)"
[dropdown]="false"
[unique]="true"
[multiple]="true"
(keyup)=onEnterClickEvent($event)
(onBlur)="onOutsideClick($event)"
placeholder="Eg. Java, Angular, Terraform"
class="w-full p-fluid" ></p-autoComplete>
现在,有一个场景我正在努力迎合。假设我是一个用户,在这个输入中手动输入文本,但由于某种原因,我的文本没有给予任何搜索建议。最后,我希望在关注标记之外的内容时能够将其包含在输入中。有一个onBlur
事件可以帮助解决这个问题,所以我是这样处理的:
onOutsideClick(event: KeyboardEvent){
let tokenInput = event.target as any
if (tokenInput.value){
this.skills.push(tokenInput.value)
tokenInput.value = ""
}
}
这在一定程度上起作用,但注意沿着一个问题。当从搜索建议中进行选择时,它会在onSelect
事件之前发出OnBlur
事件。这反过来运行上面的代码,并将用户键入的手动输入和从搜索建议中选择的内容都包含到输入列表中。有没有一种方法可以让我先运行onSelect
,然后在运行onSelect
时完全忽略onBlur
?任何其他变通方法都值得赞赏。
我已经按照this answer的建议尝试了setTimeout()
1条答案
按热度按时间ijnw1ujt1#
要实现在自动完成组件中侦听输入字段的模糊事件并在执行逻辑之前应用延迟的所需行为,可以执行以下步骤:
1.将模板引用添加到HTML文件中的自动完成组件:
1.在组件中导入
AfterViewInit
,并使用@viewChild
读取自动完成组件:1.在组件中实现
AfterViewInit
接口:1.在组件中创建
catchBlurEvent()
函数。此函数监听自动完成组件中输入字段的模糊事件,使用RxJSdelay()
添加延迟,并订阅该事件:在
catchBlurEvent()
函数中,fromEvent
用于从自动完成组件中的输入字段的模糊事件创建可观察值。然后应用delay
运算符以引入100毫秒的延迟。最后,订阅处理事件并执行所需的逻辑。通过实现这些步骤,您可以侦听自动完成输入字段的模糊事件,并在执行逻辑之前应用延迟,而无需在HTML模板中使用
(onBlur)
。