2011-11-23 15 views
9

Estoy usando GWT MVP y UiBinder para crear una aplicación con DockLayoutPanel. Quiero que los muelles norte y sur sean estáticos, que contengan botones y enlaces. Quiero tener vistas dinámicas en el centro y dos áreas diferentes de la dársena este. Como estas áreas dinámicas deberían ser independientes entre sí, estoy configurando diferentes ActivityMapper y ActivityManager para cada área de visualización dinámica; centro, este-arriba, y este-abajo.How to: UiBinder + GWT MVP + áreas de visualización independientes múltiples

¿Cómo puedo inicializar de forma independiente estas 3 áreas de visualización diferentes cuando se carga la aplicación? ¿Cómo puedo cambiar de una actividad a otra en un área de visualización sin afectar las otras áreas?

Cuando uso el goCon de PlaceController para cambiar de un Lugar a otro en un área, la Actividad de la otra área se detiene.

Mayday, por favor ayuda, mayday!

Lo que sigue es parte de mi código:

AppViewImpl.ui.xml

<g:DockLayoutPanel styleName="{style.dockPanel}" unit="PX" width="975px" height="100%"> 

    <!-- DOCK PANEL EAST --> 
    <g:east size="220"> 
     <g:LayoutPanel styleName="{style.eastPanel}"> 
      <g:layer left="0px" width="220px" top="0px" height="105px"> 
       <g:SimpleLayoutPanel ui:field="topRightPanel"/> 
      </g:layer> 

      <g:layer left="0px" width="220px" top="110px" height="340px"> 
        <g:InlineLabel styleName="{style.label}" text="ANOTHER DISPLAY AREA"/> 
      </g:layer> 
     </g:LayoutPanel> 
    </g:east> 

    <!-- DOCK PANEL NORTH --> 
    <g:north size="110"> 
     <g:LayoutPanel styleName="{style.northPanel}"> 
      <g:layer left="0px" width="755px" top="0px" height="105px"> 
        <g:InlineLabel styleName="{style.label}" text="NORTH PANEL"/> 
      </g:layer> 
     </g:LayoutPanel> 
    </g:north> 

    <!-- DOCK PANEL SOUTH --> 
    <g:south size="20"> 
     <g:LayoutPanel styleName="{style.southPanel}"> 
      <g:layer left="0px" width="755px" top="0px" height="20px"> 
        <g:InlineLabel styleName="{style.label}" text="SOUTH PANEL"/> 
      </g:layer> 
     </g:LayoutPanel> 
    </g:south> 

    <!-- DOCK PANEL CENTER --> 
    <g:center> 
     <g:SimpleLayoutPanel ui:field="mainPanel" /> 
    </g:center> 
</g:DockLayoutPanel> 

MyModule.java

MyModule clase pública implementa EntryPoint {

private Place defaultPlace = new DefaultPlace(""); 

public void onModuleLoad() { 
    // Create ClientFactory using deferred binding so we can replace with 
    // different impls in gwt.xml 
    ClientFactory clientFactory = GWT.create(ClientFactory.class); 
    EventBus eventBus = clientFactory.getEventBus(); 
    PlaceController placeController = clientFactory.getPlaceController(); 

    // Start ActivityManager for the main widget with our ActivityMapper 
    ActivityMapper topRightActivityMapper = new TopRightActivityMapper(clientFactory); 
    ActivityManager topRightActivityManager = new ActivityManager(topRightActivityMapper, eventBus); 
    topRightActivityManager.setDisplay(clientFactory.getAppView().getTopRightPanel()); 

    // Start ActivityManager for the main widget with our ActivityMapper 
    ActivityMapper mainActivityMapper = new AppActivityMapper(clientFactory); 
    ActivityManager mainActivityManager = new ActivityManager(mainActivityMapper, eventBus); 
    mainActivityManager.setDisplay(clientFactory.getAppView().getMainPanel()); 

    // Start PlaceHistoryHandler with our PlaceHistoryMapper 
    AppPlaceHistoryMapper historyMapper = GWT .create(AppPlaceHistoryMapper.class); 
    PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper); 
    historyHandler.register(placeController, eventBus, defaultPlace); 
    RootLayoutPanel.get().add(clientFactory.getAppView()); 

    // Goes to place represented on URL or default place 
    historyHandler.handleCurrentHistory(); 

    new AppController(clientFactory); 
} 

}

AppController.java

public class AppController implements AppView.Presenter { 

    private ClientFactory clientFactory; 

    AppController(ClientFactory clientFactory){ 
     this.clientFactory = clientFactory; 
     goTo(new TopRightAPlace("")); 
    } 

    @Override 
    public void goTo(Place place) { 
     clientFactory.getPlaceController().goTo(place); 
    } 

} 

TopRightAViewImpl.java

public class TopRightAViewImpl extends Composite implements TopRightAView { 

    interface Binder extends UiBinder<Widget, TopRightAViewImpl> { 
    } 

    private static final Binder binder = GWT.create(Binder.class); 

    private Presenter listener; 
    @UiField 
    Button button; 

    public TopRightAViewImpl() { 
     initWidget(binder.createAndBindUi(this)); 
    } 

    @Override 
    public void setName(String name) { 
     button.setHTML(name); 
    } 

    @Override 
    public void setPresenter(Presenter listener) { 
     this.listener = listener; 
    } 

    @UiHandler("button") 
    void onButtonClick(ClickEvent event) { 
     listener.goTo(some other place); 
    } 
} 

Respuesta

9

GWT Place s, PlaceController, y PlaceHistoryMapper le permiten crear URL que marquen favoritos dentro de su aplicación que permitan que el botón Atrás y los marcadores del navegador funcionen como uno esperaría. Para esto se diseñó GWT Place s. Por lo tanto, no tiene sentido tener más de un Place activado en una aplicación en cualquier momento ya que tiene una URL para toda la aplicación.

PlaceController El método goTo() notifica al registrado ActivityManager, que detiene la actividad actual al recibir un evento PlaceChangeEvent.

Mi sugerencia para usted es no utilizar Place sy PlaceChangeEvent s para las dos áreas en el lado este de su DockLayoutPanel. Use Place para la pantalla principal de su aplicación, que probablemente sea el centro de su DockLayoutPanel. Incendie diferentes tipos de GwtEvent, ya sea uno de los tipos de eventos genéricos (es decir, ValueChangeEvent) o un tipo de evento personalizado, para las áreas en el lado este cuando necesite tenerlas actualizadas. Todavía puede usar Activitie s para el lado este, pero tendrá que crear su propio ActivityManager, que en realidad no es tan difícil.Todo lo que tiene que hacer es copiar el ActivityManager de GWT, cambiarle el nombre y reemplazar los nombres de los métodos que manejan PlaceChangeEvent sy PlaceChangeRequestEvent con aquellos que manejan sus propios eventos.

+0

Esto es exactamente lo que terminé haciendo. ¡Gracias! – Pete

1

¿Seguro de que realmente desea utilizar la aplicación MVP de Google? Es fácil implementar este mecanismo usando mvp4g. El módulo principal sería responsable de inicializar la vista principal y proporcionar lógica para volver a cargar áreas dinámicas. Usé este marco en dos grandes proyectos y funciona como un encanto.