Как использовать GWT EventBus

Интересно, как использовать EventBus или есть ли лучшие решения для отправки Event через проект.

Widget1 имеет Button, Widget2 имеет Label, что должно измениться, когда я нажимаю кнопку. Эти виджеты находятся в DockLayout:

RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
DockLayoutPanel dock = new DockLayoutPanel(Unit.EM);

dock.addWest(new Widget1(), 10);
dock.add(new Widget2());

rootLayoutPanel.add(dock);

Я объявил handleClickAlert в Widget1:

@UiHandler("button")
void handleClickAlert(ClickEvent e) {
    //fireEvent(e); 
}

1 ответ

Решение

Когда вы разделяете проект на логические части (например, с помощью MVP), иногда необходимо связывать разные части. Обычно это сообщение отправляется путем изменения статуса, например:

  • пользователь вошел в систему / вышел из системы.
  • Пользователь перешел непосредственно через URL на страницу, поэтому меню необходимо обновить.

Использование шины событий в этих случаях вполне логично.

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

Пример с вашими собственными типами событий:

public class AppUtils{

    public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
}

Обычно вы также создаете свои собственные типы событий и обработчики:

public class AuthenticationEvent extends GwtEvent<AuthenticationEventHandler> {

public static Type<AuthenticationEventHandler> TYPE = new Type<AuthenticationEventHandler>();

  @Override
public Type<AuthenticationEventHandler> getAssociatedType() {
    return TYPE;
}

@Override
protected void dispatch(AuthenticationEventHandler handler) {
    handler.onAuthenticationChanged(this);
}
}

и обработчик:

public interface AuthenticationEventHandler extends EventHandler {
    void onAuthenticationChanged(AuthenticationEvent authenticationEvent);
}

Тогда вы используете это так:

AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler()     {
        @Override
        public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
            // authentication changed - do something
        }
    });

и запустить событие:

AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());
Другие вопросы по тегам