Подтвердить что ты не робот

Являются ли EventHandlers и SinkEvents одной и той же функциональной работой?

Я использую GWT. Я начал добавлять события к своим виджетам, добавляя EventHandlers.

Код примера обработчика событий:

    widget.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            // do something
        }
    });

Затем я обнаружил, что существует другой способ обработки событий с помощью sinkEvents().

Код примера событий стока (с этого веб-сайта):

 {
 ...
 sinkEvents(Event.ONMOUSEDOWN | Event.ONMOUSEUP | Event.ONMOUSEOVER |Event.ONMOUSEOUT)
 ...
 }

 public void onBrowserEvent(Event event) {
     Element td = getEventTargetCell(event);
     if (td == null) return;
     Element tr = DOM.getParent(td);
     switch (DOM.eventGetType(event)) {
         case Event.ONMOUSEDOWN: {
                 // do something
                 break;
         }
         case Event.ONMOUSEUP: {
                 // do something
                 break;
         }
         case Event.ONMOUSEOVER: {
                 // do something
                 break;
         }
         case Event.ONMOUSEOUT: {
                 // do something
                 break;
         }
     }
 }
  • Являются ли EventHandlers и SinkEvents выполнение одной и той же функциональной работы?
  • Если да, каковы компромиссы? (где бы вы использовали один над другим)
  • Если нет, то как они отличаются?
4b9b3361

Ответ 1

Я не эксперт GWT, но это то, что я собираю, глядя на источник GWT:

  • Все EventHandlers (в конечном итоге) вызывают addDomHandler(..), который вызывает sinkEvents(). sinkEvents() является более низким уровнем и является обтекателем браузера-абстракции вокруг собственной обработки событий javascript.

    EventHandlers создаются поверх sinkEvents, поэтому они предоставляют всю функциональность, которая имеет sinkEvents.

    Но по-разному они отличаются: с EventHandlers вы можете зарегистрироваться для разных типов событий с разными обработчиками событий, которые могут находиться в разных классах. События будут автоматически перенаправлены соответствующим обработчикам. С помощью sinkEvents вы можете зарегистрироваться для разных типов событий (через int, а не для типа), но всегда будет вызываться этот виджет onBrowserEvent(event).

  • EventHandlers добавляют определенные накладные расходы. Это спорно, если это имеет значение вообще.

  • EventHandlers - это безопасный тип для добавления и удаления обработчиков событий и автоматического способа для маршрутизации событий для зарегистрированных обработчиков по вашему выбору. Если вы используете GWT Widgets, вы должны использовать EventHandlers.