Проверка корректности вводимых данных в Choices.js строится вокруг комбинации встроенных ограничений компонента, конфигурационных параметров и перехвата пользовательских действий через события экземпляра. Библиотека не навязывает единую систему валидации, а предоставляет набор точек расширения, через которые реализуется контроль значений на уровне интерфейса и данных.
Choices.js оперирует сущностями «choice» и «item».
При включённом режиме пользовательского ввода
(addItems: true) допускается создание новых элементов,
которые не присутствуют в исходном списке. Именно этот режим требует
основного внимания при реализации валидации.
Процесс добавления нового значения проходит через внутренний пайплайн:
addItem.На каждом этапе возможно вмешательство через конфигурацию или внешнюю логику.
Одним из ключевых встроенных механизмов является запрет повторов:
const choices = new Choices(element, {
duplicateItems: false
});
При значении false повторное добавление одинаковых
значений блокируется. Сравнение выполняется по значению строки или ключу
объекта, если используется объектный формат данных.
Поведение при попытке добавления дубликата зависит от версии и конфигурации: элемент либо игнорируется, либо не проходит стадию добавления.
Контроль объёма выбранных данных реализуется через параметр:
const choices = new Choices(element, {
maxItemCount: 5,
maxItemText: 'Достигнут лимит'
});
maxItemCount ограничивает число выбранных элементов, а
maxItemText определяет текст, отображаемый при попытке
превышения лимита.
Данный механизм является формой валидации на уровне структуры данных, предотвращающей перегрузку списка выбранных значений.
Основной инструмент гибкой валидации — событие добавления элемента:
element.addEventListener('addItem', (event) => {
const { value } = event.detail;
});
Событие addItem содержит объект detail,
включающий добавляемое значение. На этом этапе возможно применение любых
правил:
При необходимости добавленный элемент может быть удалён сразу после создания:
choices.removeActiveItemsByValue(value);
Такой подход формирует пост-валидацию, когда элемент сначала добавляется, а затем отклоняется при несоответствии условиям.
Наиболее строгий контроль реализуется до добавления элемента. Для этого используется внешний обработчик, перехватывающий ввод пользователя до передачи в Choices.js.
Пример логики:
const isValid = (value) => {
return /^[a-zA-Z0-9_-]{3,20}$/.test(value);
};
Далее добавление выполняется только при успешной проверке:
if (isValid(inputValue)) {
choices.setValue([{ value: inputValue, label: inputValue }]);
}
Такой подход полностью исключает попадание некорректных данных в внутреннее состояние компонента.
Если режим пользовательского ввода отключён, валидация сводится к выбору из фиксированного набора:
const choices = new Choices(element, {
addItems: false
});
В этом режиме ввод ограничивается поиском по существующим вариантам. Любое значение, отсутствующее в списке, не может быть добавлено.
Фактически используется стратегия whitelist, где допустимые значения задаются заранее.
Поисковый механизм также влияет на допустимость значений:
const choices = new Choices(element, {
searchEnabled: true,
searchFloor: 2
});
searchFloor задаёт минимальное количество символов для
активации поиска. Это снижает вероятность ввода случайных или слишком
коротких значений.
Дополнительно используется fuseOptions (если
задействован Fuse.js внутри), что позволяет регулировать строгость
нечеткого поиска и, косвенно, качество допустимых совпадений.
Валидация часто включает нормализацию перед сохранением:
Choices.js не выполняет глубокую нормализацию автоматически, поэтому используется внешний слой:
const normalize = (value) =>
value.trim().toLowerCase();
После нормализации значение передаётся в компонент:
choices.setChoiceByValue(normalize(inputValue));
Для сложных сценариев применяется многоуровневая проверка:
Пример комбинированной проверки:
function validate(value, currentItems) {
const formatOk = /^[0-9]{4}-[A-Z]{2}$/.test(value);
const notDuplicate = !currentItems.includes(value);
const businessRule = value.startsWith('202');
return formatOk && notDuplicate && businessRule;
}
Такой подход позволяет реализовать доменно-ориентированную валидацию поверх UI-компонента.
Choices.js не содержит встроенной системы отображения ошибок, поэтому обработка строится вручную:
Пример реакции на ошибку:
element.classList.add('input-error');
или
showError('Недопустимое значение');
В сценариях, где валидация происходит постфактум, применяется удаление:
choices.removeItemByValue(value);
Логика строится вокруг проверки состояния после события
addItem.
При сложной логике важно учитывать внутреннее состояние Choices.js:
getValue(true) — получение текущих значений;clearStore() — сброс состояния;setValue() — принудительная синхронизация.Пример проверки консистентности:
const values = choices.getValue(true);
values.forEach(v => {
if (!validate(v.value, values)) {
choices.removeActiveItemsByValue(v.value);
}
});
Такой механизм используется для периодической очистки состояния.
Валидация вводимых значений в Choices.js обычно выстраивается в несколько слоёв:
duplicateItems,
maxItemCount, addItems);addItem);Такое разделение позволяет реализовать как простые формы выбора, так и сложные системы ввода с бизнес-правилами и строгими ограничениями.