FormAssociated API представляет собой механизм, позволяющий создавать
настраиваемые элементы форм, полностью интегрированные с нативным
поведением HTML-форм. Он обеспечивает взаимодействие с формой, обработку
значений, валидацию и синхронизацию состояния, аналогично стандартным
элементам <input> или
<select>.
value,
name, disabled, required и
другие.ElementInternals.Ключевой компонент FormAssociated API — объект
ElementInternals. Он предоставляет методы и свойства для
интеграции с формой:
internals.form — возвращает родительскую форму или
null, если элемент не внутри формы.internals.setFormValue(value[, state]) — устанавливает
значение элемента, которое будет отправлено вместе с формой.
Опциональный параметр state позволяет хранить
дополнительное внутреннее состояние.internals.setValidity(flags, message, anchor) — задаёт
состояние валидации элемента.internals.validationMessage — возвращает сообщение о
текущей ошибке валидации.internals.checkValidity() — проверяет валидность
элемента и возвращает true или false.internals.reportValidity() — инициирует визуальное
отображение ошибок валидации.Для создания форм-ассоциированного элемента необходимо использовать
опцию formAssociated: true в определении класса:
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html<MyInput>`<input type="text" .value="${x => x.value}" />`;
class MyInput extends FASTElement {
static formAssociated = true; // Включение FormAssociated API
internals;
value = "";
constructor() {
super();
this.internals = this.attachInternals(); // Подключение ElementInternals
}
connectedCallback() {
super.connectedCallback();
this.internals.setFormValue(this.value); // Инициализация значения для формы
}
valueChanged(prev, next) {
this.internals.setFormValue(next); // Обновление значения при изменении
}
checkValidity() {
return this.internals.checkValidity();
}
}
FASTElement.define({ name: "my-input", template, styles: css`input { padding: 4px; }` }, MyInput);
В этом примере элемент MyInput становится полноценным
участником формы: его значение отправляется при сабмите, а также можно
использовать стандартные методы валидации.
Форм-ассоциированные элементы могут реагировать на события формы:
formdata — событие, возникающее при создании данных
формы перед отправкой.reset — событие сброса формы. Можно определить
поведение элемента при сбросе значений.Пример обработки сброса:
connectedCallback() {
super.connectedCallback();
this.internals.form?.addEventListener('reset', () => {
this.value = "";
this.internals.setFormValue(this.value);
});
}
FormAssociated API позволяет полностью контролировать процесс валидации:
setValidity({ valueMissing: true }, "Поле обязательно")
— установка ошибки, эквивалентной стандартной HTML-валидации.checkValidity() — проверяет элемент и возвращает
логический результат.reportValidity() — отображает визуальное сообщение об
ошибке.Пример кастомной проверки:
validate() {
if (!this.value || this.value.length < 3) {
this.internals.setValidity({ customError: true }, "Минимум 3 символа");
} else {
this.internals.setValidity({});
}
}
FormAssociated API поддерживает синхронизацию следующих свойств:
name — имя поля, отправляемое с формой.value — текущее значение.disabled — блокировка элемента.required — обязательность заполнения.Пример синхронизации disabled:
disabledChanged(prev, next) {
this.internals.ariaDisabled = next;
}
checkValidity,
reportValidity).ElementInternals через геттеры и сеттеры.valueChanged позволяет автоматически
синхронизировать значение элемента с формой.ElementInternals обеспечивает прямую связь с родительской
формой.FormAssociated API в сочетании с FAST Element открывает возможности создавать мощные, полностью настраиваемые элементы форм, сохраняющие нативное поведение и гибкость при работе с валидацией и формами в целом.