2011-11-23 16 views
9

मैं डॉकलेआउट पैनेल के साथ एक ऐप बनाने के लिए जीडब्ल्यूटी एमवीपी और यूबिंडर का उपयोग कर रहा हूं। मैं चाहता हूं कि उत्तर और दक्षिण डॉक्स स्थिर हों, जिसमें बटन और लिंक हों। मैं केंद्र में गतिशील विचार और पूर्वी डॉक के दो अलग-अलग क्षेत्रों में जाना चाहता हूं। चूंकि इन गतिशील क्षेत्रों को एक दूसरे से स्वतंत्र होना चाहिए, मैं प्रत्येक गतिशील प्रदर्शन क्षेत्र के लिए अलग गतिविधि मैपर और गतिविधि प्रबंधक स्थापित कर रहा हूं; केंद्र, पूर्व-शीर्ष, और पूर्व-तल।कैसे करें: यूबिन्डर + जीडब्ल्यूटी एमवीपी + एकाधिक स्वतंत्र प्रदर्शन क्षेत्रों

एप्लिकेशन लोड होने पर मैं इन 3 अलग-अलग प्रदर्शन क्षेत्रों को स्वतंत्र रूप से कैसे प्रारंभ कर सकता हूं? मैं अन्य क्षेत्रों को प्रभावित किए बिना एक प्रदर्शन क्षेत्र में एक गतिविधि से दूसरे में कैसे स्विच कर सकता हूं?

जब मैं प्लेस कंट्रोलर के जाने के लिए एक क्षेत्र में एक स्थान से दूसरे स्थान पर स्विच करने के लिए उपयोग करता हूं, तो अन्य क्षेत्र की गतिविधि बंद हो जाती है।

मई, कृपया मदद करें, मई!

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 लागू करता 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); 
    } 
} 

उत्तर

9

GWT Place रों, PlaceController, और PlaceHistoryMapper अपने आवेदन के साथ के रूप में एक उम्मीद होती ब्राउज़र के वापस बटन और बुकमार्क काम करने की अनुमति के भीतर बुकमार्क यूआरएल बनाने के लिए सक्षम बनाते हैं। यही वह है जो जीडब्ल्यूटी Place एस के लिए डिज़ाइन किया गया था। इसलिए किसी भी समय एक आवेदन में सक्रिय Place से अधिक होने का अर्थ नहीं है क्योंकि आपके पास पूरे एप्लिकेशन के लिए एक यूआरएल है।

PlaceController की goTo() विधि पंजीकृत ActivityManager को सूचित करती है, जो PlaceChangeEvent प्राप्त करने पर वर्तमान गतिविधि को रोकती है।

आपके लिए आपके सुझाव Place एस और PlaceChangeEvent एस का उपयोग अपने DockLayoutPanel के पूर्व किनारे पर दो क्षेत्रों के लिए नहीं करना है। अपने एप्लिकेशन की मुख्य स्क्रीन के लिए Place एस का उपयोग करें, जो शायद आपके DockLayoutPanel का केंद्र है। आग को GwtEvent प्रकार, या तो सामान्य ईवेंट प्रकारों (यानी ValueChangeEvent) या कस्टम ईवेंट प्रकार में से एक, पूर्व पक्ष के क्षेत्रों के लिए जब आपको उन्हें अद्यतन करने की आवश्यकता होती है तो आग लगाना। आप अभी भी पूर्व दिशा के लिए Activitie एस का उपयोग कर सकते हैं, लेकिन आपको अपना खुद का ActivityManager बनाना होगा, जो वास्तव में कठिन नहीं है।आपको बस इतना करना है कि जीडब्ल्यूटी के ActivityManager की प्रतिलिपि बनाना, इसका नाम बदलें, और PlaceChangeEvent एस और PlaceChangeRequestEvent एस को संभालने वाले तरीकों के नामों को प्रतिस्थापित करें जो आपके स्वयं के कार्यक्रमों को संभालते हैं।

+0

यह वही है जो मैंने किया है। धन्यवाद! – Pete

1

क्या आप वाकई वास्तव में गूगल के एमवीपी कार्यान्वयन का उपयोग करना चाहते हैं? mvp4g का उपयोग करके इस तंत्र को कार्यान्वित करना असफल रहा है। मुख्य मॉड्यूल मुख्य दृश्य आरंभ करने और गतिशील क्षेत्रों को पुनः लोड करने के लिए तर्क प्रदान करने के लिए ज़िम्मेदार होगा। मैंने इस ढांचे का इस्तेमाल दो बड़ी परियोजनाओं में किया और एक आकर्षण की तरह काम करता है।

संबंधित मुद्दे