FAST Element — это современная библиотека для создания веб-компонентов на JavaScript, предоставляющая мощный механизм реактивности и декларативного связывания данных. Одним из ключевых инструментов для управления данными в шаблонах являются конвертеры. Конвертеры позволяют контролировать, как данные преобразуются при передаче между свойствами компонента и его разметкой, обеспечивая гибкость и безопасность отображения информации.
Конвертер — это объект или функция, которая реализует два направления преобразования данных:
Простейший конвертер может выглядеть так:
const numberConverter = {
toView(value) {
return value != null ? value.toString() : '';
},
fromView(value) {
return Number(value);
}
};
В этом примере toView преобразует число в строку для
отображения в <input>, а fromView
возвращает числовое значение из введённой строки.
В FAST Element конвертеры подключаются через директиву
:value или атрибут converter в шаблоне:
import { FASTElement, html, css } from "@microsoft/fast-element";
class MyInput extends FASTElement {
value = 0;
}
MyInput.template = html`
<input
value="${x => x.value}"
converter="${numberConverter}"
/>
`;
Ключевые моменты:
converter может принимать объект с методами
toView и fromView или просто функцию (при
одностороннем преобразовании).@observable.fromView возвращает undefined,
значение свойства не изменяется.Пользовательские конвертеры позволяют реализовать любые правила преобразования данных. Например, конвертер для форматирования даты:
const dateConverter = {
toView(date) {
if (!(date instanceof Date)) return '';
return date.toLocaleDateString('ru-RU');
},
fromView(value) {
const parsed = Date.parse(value);
return isNaN(parsed) ? null : new Date(parsed);
}
};
При использовании такого конвертера <input> будет
показывать дату в привычном формате, а компонент будет работать с
объектом Date.
Иногда необходимо создавать конвертеры с параметрами. Для этого используют функции, возвращающие объект конвертера:
function minMaxConverter(min, max) {
return {
toView(value) {
return value != null ? value.toString() : '';
},
fromView(value) {
const num = Number(value);
if (num < min) return min;
if (num > max) return max;
return num;
}
};
}
<input value="${x => x.score}" converter="${minMaxConverter(0, 100)}" />
Такой подход делает конвертеры гибкими и повторно используемыми.
Конвертеры не ограничены примитивными типами. Для массивов, объектов и JSON они часто используются для преобразования данных между строкой и структурой:
const jsonConverter = {
toView(value) {
return JSON.stringify(value, null, 2);
},
fromView(value) {
try {
return JSON.parse(value);
} catch {
return [];
}
}
};
Этот конвертер позволяет редактировать массив или объект в
<textarea> и автоматически синхронизировать его с
реактивным свойством.
FAST Element поддерживает двустороннее связывание через синтаксис
.bind. Конвертеры в этом случае работают одинаково
корректно:
<input
value="${x => x.age}"
@input="${(x, c) => x.age = c.event.target.value}"
converter="${numberConverter}"
/>
В двустороннем связывании toView отвечает за
отображение, а fromView — за обновление свойства при
изменении DOM. Это обеспечивает чистоту данных и предотвращает ошибки
типов.
toView и
fromView — конвертер должен быть лёгким, без
сложных асинхронных операций.null, чтобы избежать
некорректного состояния свойства.Конвертеры можно комбинировать с пользовательскими директивами и реактивными наблюдателями для реализации сложных сценариев:
Поскольку конвертеры действуют на уровне взаимодействия между свойством компонента и DOM, они обеспечивают безопасное и предсказуемое преобразование данных, не нарушая реактивность FAST Element.
Пользовательские конвертеры в FAST Element становятся фундаментальным инструментом для построения компонентов, где данные должны не только отображаться, но и корректно интерпретироваться при изменениях. Они создают мост между внутренним состоянием компонента и пользовательским интерфейсом, позволяя создавать богатые, безопасные и удобные для пользователя веб-компоненты.