如何使用GWT EventBus

我还不熟悉GWT,想知道如何使用EventBus,或者是否有更好的解决scheme通过项目发送事件。

小部件1有一个button。 Widget 2有一个标签,当我按下button时应该改变。 这些小部件在DockLayout中:

RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get(); DockLayoutPanel dock = new DockLayoutPanel(Unit.EM); dock.addWest(new Widget1(), 10); dock.add(new Widget2()); rootLayoutPanel.add(dock); 

我已经在Widget 1中声明了一个handleClickAlert

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

希望有人能帮助我。 谢谢!

当您将项目划分为逻辑部分(例如MVP)时,有时需要沟通。 典型的通信是发送状态更改,例如:

  • 用户login/冻结。
  • 用户直接通过URL浏览页面,所以菜单需要更新。

在这些情况下使用事件总线是相当合理的。

要使用它,你实例化一个EventBus每个应用程序,然后由所有其他类使用。 为了达到这个目的,使用静态字段,工厂或dependency injection(在GWT的情况下为GIN)。

你自己的事件types的例子:

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

通常你也会创build你自己的事件types和处理器:

 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());