【发布时间】:2018-05-25 03:26:19
【问题描述】:
我正在使用自定义搜索过滤器
HTML
<input type="text" pInputText class="ui-widget ui-text" [(ngModel)]
="gloablFilterValue" (ngModelChange)="splitCustomFilter()" placeholder="Find" />
我在搜索框上使用ngModelChange() 事件
globalSearch(realData, searchText, columns) {
searchText = searchText.toLowerCase();
return realData.filter(function (o) {
return columns.some(function (k) {
return o[k].toString().toLowerCase().indexOf(searchText) !== -1;
});
});
}
splitCustomFilter() {
let columns =
['PartNoCompleteWheel', 'DescriptionCompleteWheel', 'PartNoTyre', 'DescriptionTyre', 'PartNoRim', 'DescriptionRim','DeletedDateFromKDPStr', 'DateFromKDPStr', 'Status'];
this.tyreAndRimList = this.globalSearch(this.tyreAndRimList, this.gloablFilterValue, columns);
}
this.tyreAndRimList 变量中提到的列的值列表 column。
问题
过滤器运行良好!但主要问题是过滤器性能很差,而记录数很大(每列超过 100 行)
何时
如果输入单个字符(如a),过滤器会正常工作。但是当我连续输入字符时,浏览器就挂了。原因是过滤器一直在触发过滤器框上的每次输入(因为我正在使用ngModelChange()// onchange() 事件)
我想要什么
如果用户在搜索框中连续输入,我想停止过滤。一旦用户停止输入,那么我只需要开始过滤。
我做了什么
我尝试使用setTimeout() 来处理这个问题。但它只是等待过滤器调用一秒钟。如果用户只连续输入 2 或 3 个字符,它就可以工作。但如果用户输入超过 7 个或 8 个或以上的字符,它会继续挂起浏览器。因为许多过滤器回调同时处理。
setTimeout(() => //code of filtering ,1000);
问题
如何在用户连续输入值时停止过滤,在用户停止输入后开始过滤?
我正在使用 angular-2 和 typescript。但是这个问题与angularjs 或angular 或JavaScript 或typescript 无关,因为我想要一个想法而不是解决方案。所以我会为这个问题添加所有标签。不要删除它。谢谢
【问题讨论】:
-
您无法在完成之前停止
filter。另一方面,您可以使用for循环,您可以使用break。其他可能性:debounce your filter -
你需要debounce活动。
-
所以看看去抖动,如果过滤了,当他们再输入一个字符时就不需要过滤整个列表,只需过滤过滤后的集合。
-
当然是去抖动,但除此之外,您还可以进一步优化代码。例如,您可以(假设文本是静态的)在每行所有单元格的初始化期间创建一个连接字符串。然后只检查每行连接的字符串。这样您就可以跳过过滤器中的所有列+strtolower 的循环。
标签: javascript arrays angular typescript