Создавая одностраничное приложение с использованием Polymer.Dart, я подумал, что это лучший способ реализовать двухстороннюю шину событий.
Из ребенка <polymer-element>
я буду использовать fire
и asyncFire
. От родителя <polymer-element>
буду фиксировать все события с помощью window.on['*'].listen
.
Поскольку <polymer-element>
инкапсулирован, никакие события не будут появляться за пределами самого элемента.
import 'package:polymer/polymer.dart';
import 'dart:html';
@CustomTag('click-counter')
class ClickCounter extends PolymerElement {
@published int count = 0;
ClickCounter.created() : super.created() {
this.shadowRoot.addEventListener('click', (e) {
if(e.target is AnchorElement) {
AnchorElement anchor = e.target;
this.asyncFire('ce', detail: "Anchor ${anchor.pathname}", canBubble: true);
e.preventDefault();
}
}, true);
}
void increment(Event event, var detail, Node target) {
count++;
this.asyncFire('ce', detail: "Click...$count..", canBubble: true);
}
}
Например, чтобы перехватывать все события по клику и переходить к fire
и asyncFire
, это наиболее эффективный способ захвата всех событий по клику с помощью this.shadowRoot.addEventListener
и передачи к fire
или asyncFire
, или есть лучший, более эффективный способ слушать на самом <polymer-element>
.