Как использовать GWT EventBus - PullRequest
48 голосов
/ 17 мая 2011

Интересно, как использовать 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 Ответ

105 голосов
/ 17 мая 2011

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

  • пользователь вошел в систему / вышел из системы.
  • пользователь перешел непосредственно через 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...