Привязка атрибутов и свойств является ключевым механизмом в Polymer, обеспечивающим реактивность компонентов и упрощение обмена данными между элементами и их шаблонами. Она позволяет автоматически синхронизировать значения свойств JavaScript с DOM-атрибутами и отображением в шаблоне.
Привязка в Polymer разделяется на одностороннюю и двустороннюю:
[[property]])
передаёт значение свойства в шаблон, но изменения в DOM не отражаются
обратно в свойство.{{property}})
обеспечивает синхронизацию данных в обе стороны, позволяя элементу и его
шаблону одновременно изменять значение.Пример односторонней привязки:
class MyElement extends Polymer.Element {
static get is() { return 'my-element'; }
static get properties() {
return {
message: {
type: String,
value: 'Привет, Polymer!'
}
};
}
}
<my-element>
<div>[[message]]</div>
</my-element>
Изменение свойства message в коде автоматически обновит
содержимое <div>.
Привязка атрибутов используется для установки значений атрибутов DOM-элементов на основе свойств компонента. Синтаксис аналогичен привязке свойств:
<img src="[[imageUrl]]" alt="Изображение">
Важно понимать разницу между свойством элемента и
его атрибутом. Например, для <input>
свойство value и атрибут value ведут себя
по-разному: изменение свойства изменяет текущее значение, а изменение
атрибута — только начальное.
Двусторонняя привязка позволяет поддерживать синхронизацию между свойством компонента и полем ввода или дочерним элементом.
<dom-module id="my-input">
<template>
<input value="{{userInput::input}}">
<p>Вы ввели: [[userInput]]</p>
</template>
<script>
class MyInput extends Polymer.Element {
static get is() { return 'my-input'; }
static get properties() {
return {
userInput: {
type: String,
value: ''
}
};
}
}
customElements.define(MyInput.is, MyInput);
</script>
</dom-module>
Событие input используется для обновления свойства
userInput при изменении значения в
<input>.
Polymer поддерживает вычисляемые свойства, позволяя определять зависимые значения на основе других свойств:
static get properties() {
return {
firstName: String,
lastName: String,
fullName: {
type: String,
computed: 'computeFullName(firstName, lastName)'
}
};
}
computeFullName(first, last) {
return `${first} ${last}`;
}
Любое изменение firstName или lastName
автоматически обновит fullName.
Привязка к сложным типам данных, таким как массивы и объекты, требует использования методов Polymer для уведомления об изменениях:
this.notifyPath('property.path', value) — оповещает
систему об изменении вложенного свойства.this.push('array', value),
this.splice('array', start, deleteCount, item1, ...) —
методы для модификации массивов с автоматическим обновлением
привязок.Пример работы с массивом:
this.items = ['Элемент 1', 'Элемент 2'];
this.push('items', 'Элемент 3');
Привязка в шаблоне:
<template is="dom-repeat" items="[[items]]">
<div>[[item]]</div>
</template>
Каждое изменение массива автоматически отобразится в DOM.
Polymer позволяет использовать фильтры для трансформации данных перед отображением:
<p>[[formatDate(birthDate)]]</p>
formatDate(date) {
return new Date(date).toLocaleDateString();
}
Таким образом, привязка становится не просто передачей значения, но и способом форматирования данных для представления.
Для привязки методов к событиям в DOM применяется синтаксис
on-event:
<button on-click="handleClick">Нажми меня</button>
Метод handleClick вызывается автоматически при событии
click:
handleClick(e) {
console.log('Кнопка нажата', e);
}
Привязка атрибутов и свойств в Polymer обеспечивает мощный и гибкий механизм управления состоянием компонентов, снижая необходимость в ручной синхронизации и упрощая построение сложных интерфейсов.