【发布时间】:2018-01-10 18:55:16
【问题描述】:
我有一个使用 PrimeNG 组件的 Angular 2 应用程序。
UI 具有多选 (p-autoComplete) 的自动完成组件,类似于 the documentation 中的那个:
<p-autoComplete [(ngModel)]="countries"
[suggestions]="filteredCountriesMultiple"
(completeMethod)="filterCountryMultiple($event)"
[minLength]="1"
placeholder="Countries"
field="name"
[multiple]="true">
</p-autoComplete>
唯一的区别是,在我的例子中,输入字段有固定的尺寸和滚动条。
问题:
每当我从自动完成列表的中间删除一个元素时,它都会将焦点移到输入字段的底部。它看起来像这样:
这对用户来说很烦人,尤其是当有几个字段应该被删除时。
问题:如何在移除元素后强制滚动保持在同一位置?
如何重现:
更具体地说,您可以通过添加下一个 css 来重现问题
max-width: 150px;
max-height: 100px;
overflow-y: auto;
使用浏览器控制台直接将documentation page 转换成ui-autocomplete-multiple-container.ui-inputtext css 类。
更新:
我设法通过使用如下代码在组件中设置onUnselect 方法来获取滚动条位置:
onUnselect(event: any) {
document.querySelector("div.my-input-class").scrollTop
}
更新 2:我设法让它工作
解决方案是onUnselect 和onFocus 事件处理程序的组合。
首先。我将最后一个滚动条位置保存到 onUnselect 调用中的字段中。
第二。我在onFocus 调用期间将此值设置为指定元素。
对应的代码如下:
scrollPosition: number = 0;
onUnselect(event: any) {
let input = document.querySelector("div.my-input-class");
this.scrollPosition = input.scrollTop;
}
onFocus(event: any) {
let input = document.querySelector("div.my-input-class");
input.scrollTop = this.scrollPosition;
}
效果很好,可能这将是最终的解决方案。
但是我不喜欢它。如果 PrimeNG 的人在他们的组件中嵌入这样一个有用的功能会更好。对我来说很奇怪为什么它不开箱即用。
如果您找到更好的解决方案,请提出。
【问题讨论】:
-
你能创建一个 plunker 来复制吗?
-
似乎是光标导致了跳跃行为。所以我建议在删除项目时尝试禁用光标(可能通过禁用元素)或在删除项目之前尝试将焦点切换到其他元素。我不知道您使用的控件是否可以让您这样做,但在我可以访问计算机之前我无法对其进行测试
-
另外,这是我见过的最好的结构化问题之一。很容易看到/理解您的问题。感谢您投入时间和精力!
标签: javascript css angular autocomplete primeng