Валидация пользовательского ввода — ключевой элемент обеспечения корректности данных в веб-приложениях. В рамках Polymer эта задача решается с использованием встроенных механизмов элементов формы, а также через расширение их функционала собственными компонентами.
Polymer предоставляет набор стандартных элементов для работы с
формами: <paper-input>,
<iron-input>, <paper-textarea> и
другие. Большинство из них поддерживают встроенные атрибуты для
валидации:
required — поле обязательно для
заполнения.pattern — регулярное выражение для
проверки формата значения.min и max — ограничения
числовых полей.maxlength и minlength —
ограничения длины текста.Пример:
<paper-input label="Email" type="email" required error-message="Введите корректный email"></paper-input>
В данном примере поле обязательно для заполнения, а компонент
автоматически проверяет, соответствует ли значение формату email.
Атрибут error-message задает текст ошибки, который будет
отображаться при несоответствии.
iron-form для комплексной проверкиДля управления несколькими полями и проверки всей формы целиком
используется <iron-form>. Этот элемент агрегирует
данные всех дочерних компонентов <iron-input> или
<paper-input> и позволяет валидировать их перед
отправкой.
Пример:
<iron-form id="userForm">
<form>
<paper-input label="Имя" name="name" required></paper-input>
<paper-input label="Возраст" name="age" type="number" min="1" max="120"></paper-input>
<paper-button raised on-click="submitForm">Отправить</paper-button>
</form>
</iron-form>
Jav * aScript:
submitForm() {
const form = this.$.userForm;
if (form.validate()) {
form.submit();
} else {
console.log('Форма содержит ошибки');
}
}
Метод validate() возвращает true только
если все поля прошли проверку.
Polymer позволяет добавлять собственные правила валидации через computed properties и observer’ы. Например, можно проверять соответствие значения сложным критериям, которые невозможно задать через атрибуты.
Пример:
static get properties() {
return {
password: {
type: String,
observer: '_validatePassword'
},
passwordError: {
type: String,
value: ''
}
};
}
_validatePassword(newVal) {
if (newVal.length < 8) {
this.passwordError = 'Пароль должен содержать не менее 8 символов';
} else if (!/[A-Z]/.test(newVal)) {
this.passwordError = 'Пароль должен содержать хотя бы одну заглавную букву';
} else {
this.passwordError = '';
}
}
В шаблоне:
<paper-input label="Пароль" value="{{password}}" error-message="{{passwordError}}"></paper-input>
Такой подход позволяет создавать гибкую и расширяемую систему валидации для любых полей формы.
Иногда требуется проверка значения на сервере (например, уникальность логина). Polymer поддерживает асинхронную валидацию с помощью promise и обновления состояния ошибок после получения ответа.
Пример:
_validateUsername(username) {
fetch(`/api/check-username?username=${username}`)
.then(res => res.json())
.then(data => {
this.usernameError = data.available ? '' : 'Имя пользователя занято';
});
}
В шаблоне:
<paper-input label="Имя пользователя" value="{{username}}" error-message="{{usernameError}}" on-input="_validateUsername"></paper-input>
Для простых текстовых полей часто достаточно pattern. Он
поддерживает любые регулярные выражения и интегрируется с элементами
формы.
Пример:
<paper-input label="Телефон" pattern="^\+\d{1,3}\s\d{3}\s\d{3}-\d{2}-\d{2}$" error-message="Введите телефон в формате +7 123 456-78-90"></paper-input>
Рекомендуется комбинировать следующие подходы:
required, pattern,
min, max) — для базовой
проверки.iron-form.validate() — для проверки
всей формы перед отправкой.Такой подход обеспечивает надёжную защиту данных и улучшает пользовательский опыт, предотвращая отправку некорректных значений.