PolymerElement — захват событий onClick для передачи в CustomEvent

Создавая одностраничное приложение с использованием 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>.


person chameleon95    schedule 31.10.2013    source источник


Ответы (1)


Я не уверен, в чем заключается точный вопрос, но техника, которую вы используете, хороша, и я использую ее, чтобы обойти ретаргетинг событий.

Просто чтобы прояснить несколько вещей, события действительно всплывают из теневых деревьев, но когда они пересекают границу тени, они перенаправляются на теневой хост. Проблема с событиями кликов заключается в том, что целевое свойство является не частью события, а частью тега привязки, поэтому при перенацеливании события вы теряете доступ к свойству.

Кроме того, я не думаю, что on['*'] работает. Я не вижу никакой документации по нему, и некоторые тесты для него не работают. Вместо этого простое наличие элемента, заключающего ваши элементы, которые любой узел может прослушивать для любого типа события, должно хорошо работать в качестве вещателя. Если вы пытаетесь направить события в другой фрейм, я бы настроил шину событий для пересылки определенного набора типов событий.

person Justin Fagnani    schedule 19.05.2014