web-dev-qa-db-ja.com

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

Widget1handleClickAlertを宣言しました:

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

プロジェクトを論理的な部分に分割する場合(たとえばMVPを使用)、異なる部分が通信する必要がある場合があります。通常、この通信は、ステータスの変更を送信することで行われます。例:

  • ユーザーのログイン/ログアウト。
  • ユーザーはURLを介してページに直接移動したため、メニューを更新する必要があります。

これらの場合、イベントバスの使用は非常に論理的です。

これを使用するには、アプリごとに1つのEventBusをインスタンス化し、それが他のすべてのクラスで使用されます。これを実現するには、静的フィールド、ファクトリ、または依存性注入(GWTの場合はGIN)を使用します。

独自のイベントタイプの例:

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());
105
Peter Knego