【发布时间】:2018-08-16 22:02:11
【问题描述】:
我有这个过滤器,它从一个大数组(这个数组中大约 500 个项目)中返回一个项目的子集
import { Injectable, Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'searchFilter'
})
@Injectable()
export class FilterArrayPipe implements PipeTransform {
transform(value: any, ...args): any {
// tslint:disable-next-line:no-unused-expression
console.log(value, args);
if ( typeof args[0] === 'undefined') {
return value;
} else if (value) {
return value.filter(item => {
// tslint:disable-next-line:prefer-const
for (let key in item) {
if ((typeof item[key] === 'string' || item[key] instanceof String) &&
(item[key].toUpperCase().indexOf(args[0].toUpperCase()) !== -1)) {
return true;
}
}
});
}
}
}
每当我在文本框中键入时,字符实际显示在框中需要几秒钟,然后再返回几秒钟更新列表以返回搜索项。
我尝试添加slice:0:10 以限制屏幕上的项目数量,但它有同样的问题,所以我猜测速度缓慢是由于大数组而不是屏幕渲染。
我已经和后端开发人员谈过了,由于这个数组被其他人使用,他不会修改它。我能做些什么来提高性能?
编辑:包含 html 代码:
<form *ngFor='let subarray of array | searchFilter: filterText | slice:0:20 ; let i = index;' #form="ngForm" (ngSubmit)="Save(form)">
<fieldset>
<input type="text" name="country" [ngModel]="subarray.country ">
<input type="number" name="number" [ngModel]="subarray.number ">
............about 24 input fileds in total ..............
</fieldset>
</form>
【问题讨论】:
-
能否请您添加组件的 HTML 模板的相关部分。
-
你好,首先删除控制台日志,如果你有一个大的打印会很慢,第二个值是500大小的数组?如果是这样,每个项目的大小是多少
-
@cyrix 包含了 html 代码
-
为数组中的 500 个条目添加 24 个 dom 元素将是昂贵的,期间。我能想到的大幅提高性能的最好方法是使用某种虚拟滚动,但这样做时你必须记住的是每个元素的高度必须完全相同。如果不能保证,就会遇到滚动问题。
-
@AmitWagner 嗯。 . .我删除了控制台日志,它确实有点帮助。但是文本框和结果仍然有一点延迟。每个项目有大约 6 个属性和一个数组,但该数组最多有 13 个属性
标签: javascript angular angular6