Встроенная валидация в библиотеке строится вокруг контроля операций добавления и удаления элементов, а также фильтрации вводимых значений до их попадания в список выбранных значений. В основе лежит набор конфигурационных параметров и перехватывающих механизмов, позволяющих ограничивать допустимое состояние компонента без внешних валидаторов.
Ключевая особенность заключается в том, что проверка выполняется не постфактум, а в момент изменения состояния: при вводе, выборе из списка или программном добавлении элемента.
Одним из базовых механизмов встроенной валидации выступает ограничение числа выбранных значений.
Параметр maxItemCount задаёт верхний предел количества
выбранных элементов:
Типичный сценарий — мультиселекты с фиксированным числом ответов (например, выбор до 3 тегов).
new Choices('#example', {
maxItemCount: 3
});
Поведение системы в этом режиме:
Параметр maxItemTextLength ограничивает длину вводимого
или добавляемого элемента.
Используется в сценариях:
new Choices('#tags', {
maxItemTextLength: 20
});
Механика работы:
Это позволяет предотвращать перегрузку интерфейса слишком длинными значениями и поддерживать единый визуальный формат.
Контроль повторяющихся значений реализуется через параметр
duplicateItemsAllowed.
new Choices('#select', {
duplicateItemsAllowed: false
});
Логика:
false одинаковые элементы не могут быть добавлены
повторноОсобенно важно в сценариях:
Наиболее гибкий механизм встроенной валидации — функция
addItemFilter, позволяющая перехватывать добавление
элемента и принимать решение о допустимости значения.
new Choices('#input', {
addItemFilter: (value) => {
return /^[a-zA-Z0-9_]+$/.test(value);
}
});
Поведение:
true разрешает добавлениеfalse блокирует вставкуПри использовании режима свободного ввода
(removeItemButton, addItem) валидация
становится критически важной, поскольку пользователь может вводить
произвольные значения.
Встроенный механизм работает на нескольких уровнях:
addItemFiltermaxItemTextLengthmaxItemCountduplicateItemsAllowedКомбинация этих параметров формирует базовый валидатор без внешних библиотек.
Валидация применяется не только к пользовательскому вводу, но и к API-методам:
const instance = new Choices('#select');
instance.setValue([{ value: 'test', label: 'Test' }]);
При программном добавлении действуют те же ограничения:
maxItemCount блокирует добавлениеaddItemFilter может отклонить значениеЭто обеспечивает единообразие поведения независимо от источника данных.
При попытке добавить недопустимое значение библиотека не генерирует критическую ошибку, а использует мягкое отклонение:
Такой подход снижает вероятность разрыва логики интерфейса при ошибках ввода.
Дополнительный уровень контроля обеспечивается событиями:
addItemremoveItemchangeinvalidС их помощью можно реализовать внешнюю проверку:
const el = document.querySelector('#select');
el.addEventListener('addItem', (event) => {
const value = event.detail.value;
if (value.includes('admin')) {
event.preventDefault();
}
});
Хотя это уже выходит за рамки встроенной логики, события позволяют усиливать базовую валидацию без изменения конфигурации компонента.
Встроенная модель валидации ориентирована на UI-уровень и не заменяет полноценную бизнес-валидацию:
Однако комбинация параметров и фильтров покрывает большинство задач фронтенд-валидации: контроль ввода, ограничение структуры и защита от некорректных значений на уровне интерфейса.