Модель событий в Polymer строится на основе стандартной DOM-архитектуры событий, расширенной механизмами, специфичными для веб-компонентов. Основная цель — обеспечить взаимодействие компонентов между собой и с внешним DOM, сохраняя инкапсуляцию и предсказуемость поведения.
В основе лежит стандартное поведение событий в браузере: события могут всплывать (bubbling) или перехватываться на фазе захвата (capturing). В Polymer используется этот механизм в полной мере, но добавляются особенности для работы с теневым DOM:
document.composed: true позволяет событию пройти через границы
теневого DOM. Это критично для связи инкапсулированных компонентов с
внешним миром.Пример создания события с использованием
CustomEvent:
this.dispatchEvent(new CustomEvent('user-logged-in', {
detail: { userId: 42 },
bubbles: true,
composed: true
}));
detail — объект с дополнительной информацией.bubbles: true — событие будет всплывать.composed: true — событие выйдет за пределы теневого
DOM.Для обработки событий в Polymer применяются два основных подхода: обработчики в шаблоне и прямое добавление слушателей через JavaScript.
<dom-module id="user-card">
<template>
<button on-click="handleClick">Нажми меня</button>
</template>
<script>
class UserCard extends Polymer.Element {
static get is() { return 'user-card'; }
handleClick(e) {
console.log('Кнопка нажата', e);
}
}
customElements.define(UserCard.is, UserCard);
</script>
</dom-module>
on-eventName, где
eventName — имя события.this.addEventListener('user-logged-in', e => {
console.log('Пользователь вошёл', e.detail.userId);
});
capture и once:this.addEventListener('user-logged-in', e => { ... }, { capture: true, once: true });
Polymer вводит концепцию обработки событий с привязкой к свойствам. Это позволяет изменять состояние компонента на основе приходящих событий без прямого вызова методов.
Пример:
<my-input value="{{username::input}}"></my-input>
{{}} обеспечивает синхронизацию
свойства username с событием input.::eventName указывает, какое событие
использовать для обновления свойства.Это упрощает реактивное обновление интерфейса, минимизируя необходимость вручную управлять событиями и состоянием.
Polymer активно использует CustomEvent для создания событий, которые:
Пример делегирования события от дочернего компонента:
class ChildElement extends Polymer.Element {
fireUserAction(data) {
this.dispatchEvent(new CustomEvent('user-action', {
detail: data,
bubbles: true,
composed: true
}));
}
}
class ParentElement extends Polymer.Element {
connectedCallback() {
super.connectedCallback();
this.addEventListener('user-action', e => {
console.log('Данные от ребёнка:', e.detail);
});
}
}
composed: true для событий, которые
должны выйти за пределы компонента.bubbles: true для событий, которые должны
достигать родительских элементов.{{property::event}}, что упрощает управление
состоянием.dispatchEvent.bubbles определяет всплытие
вверх по DOM.composed определяет, проходит
ли событие через теневой DOM.detail.::event.Модель событий в Polymer сочетает стандартные механизмы DOM с расширениями для работы с инкапсуляцией компонентов и реактивными свойствами, что делает взаимодействие между компонентами гибким, предсказуемым и удобным для построения сложных интерфейсов.