Polymer — это библиотека для создания веб-компонентов на JavaScript, ориентированная на повторное использование элементов интерфейса. Одним из ключевых аспектов разработки компонентов является правильное отображение и форматирование данных, включая текст и числовые значения. Polymer предоставляет мощные средства для привязки данных и фильтрации их через computed properties и formatters.
В Polymer данные между компонентом и DOM связываются с помощью
синтаксиса double curly braces ({{ }}) для
двусторонней привязки и square brackets
([[ ]]) для односторонней. Для форматирования
чисел и текста часто используют вычисляемые свойства:
class MyElement extends Polymer.Element {
static get is() { return 'my-element'; }
static get properties() {
return {
amount: {
type: Number,
value: 0
},
formattedAmount: {
type: String,
computed: '_formatAmount(amount)'
}
};
}
_formatAmount(amount) {
return amount.toLocaleString('ru-RU', { style: 'currency', currency: 'RUB' });
}
}
customElements.define(MyElement.is, MyElement);
В этом примере свойство formattedAmount автоматически
обновляется при изменении amount. Метод
_formatAmount использует стандартный JavaScript API
toLocaleString, что позволяет отображать числа в формате
валюты с учётом локализации.
Polymer поддерживает применение фильтров через вычисляемые свойства. Фильтры могут преобразовывать как строки, так и числа:
_formatText(text) {
if (!text) return '';
return text.trim().replace(/\s+/g, ' ');
}
_formatNumber(num) {
return num.toFixed(2);
}
Применение в шаблоне:
<p>[[ _formatText(description) ]]</p>
<p>[[ _formatNumber(price) ]]</p>
Особенности:
Для сложных числовых форматов используется объект
Intl.NumberFormat:
_formatLocalizedNumber(value) {
return new Intl.NumberFormat('ru-RU', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value);
}
Пример использования:
<span>[[ _formatLocalizedNumber(salary) ]] ₽</span>
Это обеспечивает единообразное отображение чисел, включая:
Polymer не имеет встроенных дата-форматтеров, но через вычисляемые
свойства можно использовать стандарт
Intl.DateTimeFormat:
_formatDate(date) {
if (!date) return '';
return new Intl.DateTimeFormat('ru-RU', { year: 'numeric', month: 'long', day: 'numeric' }).format(new Date(date));
}
Пример в шаблоне:
<p>Дата публикации: [[ _formatDate(publishedAt) ]]</p>
Преимущества такого подхода:
Иногда требуется изменять формат в зависимости от условий:
_formatConditionalAmount(amount, isLarge) {
if (isLarge) {
return amount.toLocaleString('ru-RU', { notation: 'compact' });
}
return amount.toLocaleString('ru-RU');
}
Использование в шаблоне с несколькими аргументами:
<p>[[ _formatConditionalAmount(amount, isLarge) ]]</p>
Это позволяет адаптировать отображение чисел для различных контекстов, например для компактного отображения больших сумм.
Для форматирования текста на уровне отображения рекомендуется использовать CSS-переменные и миксины Polymer:
:host {
--text-color: #333;
--font-size: 16px;
}
p {
color: var(--text-color);
font-size: var(--font-size);
line-height: 1.5;
}
Сочетание привязки данных с CSS-переменными позволяет управлять визуальным стилем текста без изменения логики компонентов.
toLocaleString,
Intl.NumberFormat, Intl.DateTimeFormat.Эти инструменты делают Polymer мощным фреймворком для создания компонент с корректным и локализованным отображением данных.