Как использовать 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());