Polymer — это библиотека для создания веб-компонентов, которая активно использует концепцию data binding (привязки данных). Привязка данных позволяет синхронизировать состояние компонентов с их отображением в DOM, обеспечивая реактивное поведение интерфейса. В Polymer реализованы два основных типа привязки: односторонняя и двусторонняя. Каждый из них имеет свои особенности и области применения.
Односторонняя привязка реализуется с помощью конструкции:
<div>{{property}}</div>
или через атрибуты:
<child-element some-attr="[[property]]"></child-element>
Ключевые особенности:
Пример:
class MyElement extends Polymer.Element {
static get is() { return 'my-element'; }
static get properties() {
return {
message: {
type: String,
value: 'Привет, Polymer!'
}
};
}
}
customElements.define(MyElement.is, MyElement);
<my-element></my-element>
В шаблоне:
<p>[[message]]</p>
Если свойство message изменится в компоненте, текст
внутри <p> обновится автоматически, но изменения
текста в <p> вручную не повлияют на
message.
Двусторонняя привязка позволяет синхронизировать данные в обе
стороны — изменения в DOM автоматически обновляют свойство, и
изменения свойства обновляют DOM. В Polymer она реализуется через
символ {{}} для вложений в шаблоне.
Пример:
<input value="{{username::input}}">
<p>Привет, {{username}}!</p>
Объяснение ключевых аспектов:
::input: указывает, что
обновление значения происходит при событии input.<input> свойство username немедленно
изменяется, что автоматически обновляет все места, где оно
используется.В Jav * aScript:
class UserForm extends Polymer.Element {
static get is() { return 'user-form'; }
static get properties() {
return {
username: {
type: String,
value: ''
}
};
}
}
customElements.define(UserForm.is, UserForm);
| Параметр | Односторонняя ([[ ]]) | Двусторонняя ({{ }}) |
|---|---|---|
| Направление данных | Компонент → DOM | Компонент ↔︎ DOM |
| Подходит для | Отображения, вычисляемых данных | Форм, интерактивных компонентов |
| События пользователя | Не изменяют свойство | Изменяют свойство через DOM |
| Производительность | Легче и быстрее | Может быть тяжелее при большом количестве связей |
Polymer позволяет комбинировать привязку с вычисляемыми свойствами. Это особенно полезно для двусторонней привязки, где отображаемое значение может зависеть от нескольких свойств.
Пример вычисляемого свойства:
static get properties() {
return {
firstName: String,
lastName: String,
fullName: {
type: String,
computed: 'computeFullName(firstName, lastName)'
}
};
}
computeFullName(firstName, lastName) {
return `${firstName} ${lastName}`;
}
В шаблоне:
<p>Полное имя: [[fullName]]</p>
Любое изменение firstName или lastName
автоматически обновляет fullName. Это работает с
односторонней привязкой, но может использоваться и совместно с
двусторонней, если нужно отражать ввод пользователя.
При использовании дочерних компонентов:
<child-element some-prop="[[parentProp]]"></child-element>
<child-element some-prop="{{parentProp}}"></child-element>
Это особенно полезно для форм и интерактивных элементов, где состояние должно синхронизироваться между уровнями иерархии.
Система привязки данных в Polymer обеспечивает высокую гибкость и реактивность компонентов, делая создание сложных веб-приложений более структурированным и управляемым.