web-dev-qa-db-fra.com

Comment utiliser le GWT EventBus

Je me demande comment utiliser le EventBus ou s'il existe de meilleures solutions pour envoyer un Event à travers le projet.

Widget1 a un Button. Widget2 a un Label, qui devrait changer lorsque j'appuie sur le bouton. Ces widgets sont dans un DockLayout:

RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
DockLayoutPanel dock = new DockLayoutPanel(Unit.EM);

dock.addWest(new Widget1(), 10);
dock.add(new Widget2());

rootLayoutPanel.add(dock);

J'ai déclaré un handleClickAlert dans Widget1:

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

Lorsque vous divisez le projet en parties logiques (par exemple avec MVP), les différentes parties doivent parfois communiquer. Typiquement, cette communication se fait en envoyant des changements d'état, par exemple:

  • utilisateur connecté/déconnecté.
  • l'utilisateur a navigué directement via l'URL vers une page, le menu doit donc être mis à jour.

L'utilisation du bus d'événements est tout à fait logique dans ces cas.

Pour l'utiliser, vous instanciez un EventBus par application qui est ensuite utilisé par toutes les autres classes. Pour cela, utilisez un champ statique, une injection d'usine ou de dépendance (GIN en cas de GWT).

Exemple avec vos propres types d'événements:

public class AppUtils{

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

Normalement, vous créez également vos propres types d'événements et gestionnaires:

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

et le gestionnaire:

public interface AuthenticationEventHandler extends EventHandler {
    void onAuthenticationChanged(AuthenticationEvent authenticationEvent);
}

Ensuite, vous l'utilisez comme ceci:

AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler()     {
        @Override
        public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
            // authentication changed - do something
        }
    });

et déclencher l'événement:

AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());
105
Peter Knego