Добавьте в библиотеку компонент combobox.
Мы имеем дело с большим количеством данных. Наш dt-select действительно не работает с большим набором опций. Функциональность поиска для dt-select такая же, как и для собственного выбора. Следовательно, пользователь может перейти только к параметру, который начинается с клавиши, нажатой пользователем.
Это действительно ограничение в случаях использования с большими наборами данных.
В этом нам может помочь компонент combobox, который может быть построен из ввода с прикрепленным dt-autocomplete.
На входе должен отображаться текст-заполнитель.
Поле со списком должно использовать те же стили, что и dt-select.
При щелчке раскрывающегося списка открывается список из нескольких элементов, из которых пользователь может выбирать, и курсор помещается в поле ввода. Как только пользователи начнут печатать, поле со списком должно сгенерировать отклоненное событие и показать индикатор загрузки внутри ввода, аналогичный тому, который у нас уже есть в поле фильтра.
После выбора элемента раскрывающийся список закрывается, и поле ввода обновляется соответствующим образом.
Для первой версии поля со списком я предлагаю не беспокоиться о виртуальной прокрутке. Мы можем ожидать, что фильтрация элементов будет выполняться на стороне сервера. Элементы, заполненные на клиенте, могут быть отображены. Во второй версии мы можем улучшить обработку больших наборов данных.
Для первой версии я бы предложил использовать dt-autocomplete, но мы должны рассмотреть возможность создания упрощенного раскрывающегося списка с помощью списка данных.
В качестве справочника по специальным возможностям рассмотрите рекомендации по передовой практике из комбинированного списка WAI-ARIA со всплывающим списком.
Поле со списком предложений API
Расширенная структура
<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
<dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>
Входы
| Имя | Тип | Описание |
| ------------- | ------------- | ------------- |
| value
| string \| undefined
| Начальное значение для входа |
| placeholder
| string \| undefined
| Заполнитель для ввода |
Выходы
| Имя | Тип | Описание |
| ------------- | ------------- | ------------- |
| valueChanges
| EventEmitter<string>
| Событие генерируется при выборе нового значения |
| filterChanges
| EventEmitter<string>
| Событие возникает при изменении фильтра |
Проекция контента
dt-option
dt-optgroup
Контрольный список
Привет, @ lukett89 , спасибо за предложение API. Действительно отличная отправная точка.
Я думаю, нам понадобятся те же входные данные, что и в dt-select
.
Я бы добавил
| Имя | Тип | Описание |
| ------------- | ------------- | ------------- |
| id
| string
| Id для выбора |
| compareWith
| (v1: T, v2: T) => boolean
| Функция сравнения значений параметров с выбранными значениями |
| required
| boolean
| Требуется ли ввод |
| panelClass
| string
| Класс добавлен в раскрывающийся список combobox |
Мы также должны рассмотреть возможность добавления геттеров для открытого состояния, такого как «открыто», и выходов при изменении этого состояния.
Я думаю, было бы полезно, если бы мы могли придерживаться ближайшего к выбранному API API, чтобы сделать переключение между одним или другим как можно проще.
Спасибо за ответ @ ffriedl89.
Мы учтем все упомянутые вами входы / выходы для первой версии компонента.
Поле со списком окончательного предложения по API
Расширенная структура
<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
<dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>
Входы
| Имя | Тип | Описание |
| ------------- | ------------- | ------------- |
| value
| string \| undefined
| Начальное значение для входа |
| placeholder
| string \| undefined
| Заполнитель для ввода |
| id
| строка | Id для выбора |
| compareWith
| (v1: T, v2: T) => boolean
| Функция сравнения значений параметров с выбранными значениями |
| required
| boolean
| Требуется ли ввод |
| panelClass
| string
| Класс добавлен в раскрывающийся список combobox |
Выходы
| Имя | Тип | Описание |
| ------------- | ------------- | ------------- |
| valueChanges
| EventEmitter<string>
| Событие генерируется при выборе нового значения |
| filterChanges
| EventEmitter<string>
| Событие возникает при изменении фильтра |
| openedChange
| EventEmitter
Проекция контента
dt-option
dt-optgroup
Контрольный список
Я хотел бы позаботиться о внедрении этой функции в течение следующих 2 недель. Не могли бы вы передать мне проблему?
Синхронно и после обсуждения с @ lukett89 я переназначил проблему.
Предлагаю добавить еще два входа:
| Имя | Тип | Значение по умолчанию | Описание |
| --- | --- | --- | --- |
| загрузка | boolean
| false
| Если установлено значение true, отображается индикатор загрузки, показывающий пользователю, что данные в данный момент загружаются / фильтруются |
| displayWith | (value: T) => string
| (value: T) =>
$ {значение} `| Функция, возвращающая отображаемое имя для данного объекта, представляющего опцию из поля со списком |
Функция displayWith актуальна для использования поля со списком с объектами, и индикатор загрузки кажется оправданным для компонента, который - в большинстве случаев - переносит фильтрацию на сторону сервера.
Самый полезный комментарий
Предлагаю добавить еще два входа:
| Имя | Тип | Значение по умолчанию | Описание |
| --- | --- | --- | --- |
| загрузка |
boolean
|false
| Если установлено значение true, отображается индикатор загрузки, показывающий пользователю, что данные в данный момент загружаются / фильтруются || displayWith |
(value: T) => string
|(value: T) =>
$ {значение} `| Функция, возвращающая отображаемое имя для данного объекта, представляющего опцию из поля со списком |Функция displayWith актуальна для использования поля со списком с объектами, и индикатор загрузки кажется оправданным для компонента, который - в большинстве случаев - переносит фильтрацию на сторону сервера.