Различать события для нескольких прикрепленных виджетов gwt - PullRequest
1 голос
/ 18 ноября 2010

Я пытался заставить нескольких докладчиков «слушать» одно и то же событие, но я старался сделать каждое событие уникальным для докладчика.

Ex. Я создаю 3 Композитных виджета каждый на одной вкладке. Все они привязываются к одному и тому же событию при привязке. Давайте назовем это «NewPrescriptionEvent». Если это событие сработает, все мои 3 композиты попытаются выполнить DO . Я только хочу, чтобы один из них сделал это.

Единственный способ найти это - создать временный идентификатор события (целое число внутри события), который я проверяю для каждого виджета, который пытается ответить на событие.

Фрагмент кода

private class OnNewPrescription implements NewPrescriptionHandler {

    @Override
    public void onNewPrescription(NewPrescriptionEvent event, int dataObjectId) {

        if (getDataObject().getPatientId() == dataObjectId) {
        ...
        }
    }
}

Во время переплета я делаю обычное:

eventBus.addHandler(NewPrescriptionEvent.TYPE, new OnNewPrescription());

Событие:

public class NewPrescriptionEvent extends GwtEvent<NewPrescriptionHandler> {

    public static final GwtEvent.Type<NewPrescriptionHandler> TYPE = new GwtEvent.Type<NewPrescriptionHandler>();

    private int dataObjectId;

    public NewPrescriptionEvent(int dataObjectId) {
        this.dataObjectId = dataObjectId; 
    }

    @Override
    protected void dispatch(NewPrescriptionHandler handler) {
        handler.onNewPrescription(this, dataObjectId);      
    }

    @Override
    public GwtEvent.Type<NewPrescriptionHandler> getAssociatedType() {
        return TYPE;
    }
}

Я думал, что ТИП должен быть разным каждый раз, но все же быть одним и тем же событием. У кого-нибудь есть предложения?

Thx.

Ответы [ 4 ]

2 голосов
/ 18 ноября 2010

Это тот случай, когда у вас есть произвольное количество экземпляров одного и того же докладчика, и все слушают один и тот же тип события?И каждый из ваших докладчиков «контролирует» отдельную сущность, и поэтому должен реагировать только на события, исходящие от этой сущности?Если это так, то единственным решением, которое я вижу, является параметризация события, как вы сделали.

1 голос
/ 30 августа 2011

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

Хороший набор правил для асинхронной обработки событий без общего EventBus:

  • Общение с дочерними виджетами с помощью прямых вызовов методов.
  • Связь с родительским виджетом через обратные вызовы / обработчики / слушатели.
  • Избегайте прямого знания виджетов-братьев и сестер (возможно, не в этом дело)

Таким образом, виджет, который содержит 3 вкладки, может прикреплять обратные вызовы к каждой вкладке, которая при вызове отправляет каждое событие в соответствующий обработчик событий (я думаю, что в вашем случае Presenters).

Не требуется глобальное общение, знание источников или назначений, только один тип события, один тип виджета с вкладками многократного использования и класс вкладок остается простым. В принципе, не слишком отличается от добавления ValueChangeHandler к CheckBox (в конце концов, никто не подписывается на события флажков через шину событий, вы просто добавляете обработчик непосредственно в виджет).

Грубый набросок:

public class TabContainer implements IsWidget {
  public TabContainer() {
    tab1.addNewPrescriptionHandler(
        new NewPrescriptionEventHandler() {
          @Override
          public void handleNewPrescriptionEvent(NewPrescriptionEvent event) {
            handleTab1Event(event);
          }
        });
    tab2.addNewPrescriptionHandler(
        new NewPrescriptionEventHandler() {
          @Override
          public void handleNewPrescriptionEvent(NewPrescriptionEvent event) {
            handleTab2Event(event);
          }
        });
    ...
  }
}

И вы могли бы даже упростить это с некоторой цикличностью и сопряжением.

С другой стороны, этот контейнер также может отправлять события назад на ваших виджетов откуда угодно, используя те же принципы.

Кроме того, в зависимости от того, что содержит класс Event, вам может даже не понадобиться класс Event; Вы можете определить свои обратные вызовы и параметры, как хотите.

0 голосов
/ 19 ноября 2010

Вы можете попробовать использовать addHandlerToSource(GwtEvent.Type<H> type, Object source, H handler), если вы знаете источник для прослушивания.

Другой возможностью будет расширение EventBus для принятия какого-либо фильтра при регистрации.

0 голосов
/ 18 ноября 2010

Я думаю, что заголовок вопроса - ваш ответ.

Вам нужны разные типы событий для каждого из виджетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...