2011-11-23 14 views
9

Sto utilizzando GWT MVP e UiBinder per creare un'app con un DockLayoutPanel. Voglio che i bacini nord e sud siano statici, contenenti pulsanti e collegamenti. Voglio avere viste dinamiche al centro e due diverse aree del bacino est. Poiché queste aree dinamiche devono essere indipendenti l'una dall'altra, sto configurando ActivityMapper e ActivityManager diversi per ciascuna area di visualizzazione dinamica; centro, est-alto e est-basso.Istruzioni: UiBinder + GWT MVP + più aree di visualizzazione indipendenti

Come è possibile inizializzare in modo indipendente queste 3 diverse aree di visualizzazione quando l'applicazione viene caricata? Come posso passare da un'attività all'altra in un'area di visualizzazione senza influire sulle altre aree?

Quando utilizzo il goTo di PlaceController per passare da un luogo a un altro in un'area, l'attività dell'altra area viene interrotta.

Mayday, per favore aiutatemi, mayday!

Quello che segue è un po 'del mio codice:

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

public class MyModule 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); 
    } 
} 

risposta

9

GWT Place s, PlaceController, e PlaceHistoryMapper consentono di creare URL segnalibro all'interno della vostra applicazione che consentono bottone e segnalibri indietro del browser per lavorare come ci si aspetterebbe. Questo è stato progettato per GWT Place s. Pertanto, non ha senso avere più di uno Place attivato in un'applicazione in qualsiasi momento poiché si dispone di un URL per l'intera applicazione.

PlaceController Il metodo goTo() notifica allo ActivityManager registrato, che arresta l'attività corrente alla ricezione di un oggetto PlaceChangeEvent.

Il mio suggerimento per voi è di non usare Place s e PlaceChangeEvent s per le due aree sul lato est del DockLayoutPanel. Utilizzare Place s per la schermata principale dell'applicazione, che è probabilmente il centro di DockLayoutPanel. Attiva diversi tipi GwtEvent, uno dei tipi di eventi generici (ad esempio ValueChangeEvent) o un tipo di evento personalizzato, per le aree sul lato est quando è necessario aggiornarle. È comunque possibile utilizzare Activitie s per il lato est, ma è necessario creare il proprio ActivityManager, che in realtà non è così difficile.Tutto quello che devi fare è copiare GWT ActivityManager, rinominarlo e sostituire i nomi dei metodi che gestiscono PlaceChangeEvent se PlaceChangeRequestEvent s con quelli che gestiscono i tuoi eventi.

+0

Questo è esattamente quello che ho finito per fare. Grazie! – Pete

1

Sei sicuro davvero si vuole usare l'esecuzione mvp di Google? È facile implementare questo meccanismo usando mvp4g. Il modulo principale sarebbe responsabile dell'inizializzazione della vista principale e della logica per ricaricare le aree dinamiche. Ho usato questa struttura in due grandi progetti e funziona come un fascino.

Problemi correlati