Я использую автозаполнение Angular Materials, чтобы позволить пользователю искать строку формата: «[ID #] - [Текстовое описание]». Данные предварительно извлекаются в самом начале загрузки страницы и содержат около 39 000 строк.
Мой HTML-код:
<md-input-container>
<input mdInput placeholder="TSN Search" [mdAutocomplete]="auto" [formControl]="TSN_Ctrl">
</md-input-container>
<md-autocomplete #auto="mdAutocomplete">
<md-option *ngFor="let tsn of filtered_TSNs | async" [value]="tsn">
{{ tsn }}
</md-option>
</md-autocomplete>
И мой машинописный код:
TSN_Ctrl: FormControl = new FormControl();
filtered_TSNs: any;
constructor(){
this.filtered_TSNs = this.TSN_Ctrl.valueChanges
.startWith(null)
.map(val => val ? this.filter_TSNs(val) : this.dataService.tsnTitles.slice());
}
private filter_TSNs(val: string) {
return this.dataService.tsnTitles.filter(option => new RegExp(`^${val}`, 'gi').test(option));
}
По сути, я использую стандартный код из примера Angular Materials с небольшой адаптацией.
Функция автозаполнения невероятно медленная и практически не отвечает. Я понимаю, что есть много вариантов (строк 39k), но они предварительно извлекаются и хранятся локально.
Могу ли я что-то сделать, чтобы ускорить это, или в списке слишком много строк? Если я изменю метод фильтрации и строки так, чтобы они содержали только поле идентификатора, может ли это ускорить процесс? Нужно ли мне использовать совершенно другую библиотеку (например, если известно, что автозаполнение Angular Materials работает медленно)?
console.time
к вашему методуfilter_TSNs
, чтобы увидеть, сколько времени занимает каждый фильтр, хотя я ожидаю, что это будет довольно быстро. Настоящим виновником, вероятно, является автозаполнение/угловая попытка отобразить компоненты опций 39k (!) Возможно, вы захотите вернуть подмножество вfilter_TSNs
(например, первые 50 опций) - person Will Howell   schedule 21.07.2017