如何使用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());