2011-05-17 11 views
47

Todavía no estoy familiarizado con GWT y me pregunto cómo usar EventBus o si hay algunas mejores soluciones para enviar un evento a través del proyecto.Cómo usar GWT EventBus

El widget 1 tiene un botón. El widget 2 tiene una etiqueta, que debería cambiar cuando presiono el botón. Estos widgets están en un DockLayout:

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

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

    rootLayoutPanel.add(dock); 

que han declarado una handleClickAlert en el Widget 1

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

Con suerte alguien me puede ayudar a cabo. ¡Gracias!

Respuesta

104

Cuando divide el proyecto en partes lógicas (por ejemplo, con MVP), algunas partes a veces necesitan comunicarse. La comunicación típica es el envío de cambios de estado, por ejemplo:

  • usuario conectado/loged-out.
  • usuario navegó directamente a través de la URL a la página para que el menú debe actualizarse.

El uso del bus de eventos es bastante lógico en esos casos.

Para usarlo crea una instancia de un EventBus por aplicación que luego es utilizada por todas las demás clases. Para lograr esto, use campo estático, fábrica o inyección de dependencia (GIN en caso de GWT).

Ejemplo con usted el propietario de tipos de eventos:

public class AppUtils{ 

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

Normalmente también se crearía sus propios tipos de eventos y controladores:

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

y el manejador:

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

Entonces lo usa así:

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

y desencadenar el evento:

AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent()); 
+0

Gracias. Esto me ayuda mucho! – Mark

+0

Al disparar el evento, ¿cómo podría enviar un objeto? En mi caso, debería enviar una clase que contenga la información de mis usuarios. – elvispt

+8

Puede tener un campo en su evento personalizado y configurarlo a través de un constructor, es decir, 'nuevo AuthenticationEvent (someObject)' –