2011-11-23 2 views
9

GWT MVP 및 UiBinder를 사용하여 DockLayoutPanel을 사용하여 응용 프로그램을 만듭니다. 나는 북쪽과 남쪽 부두가 정적이고 버튼과 링크가 들어 있기를 바랍니다. 나는 중심부와 동쪽 부두의 두 가지 영역에서 역동적 인 견해를 갖고 싶다. 이러한 동적 영역은 서로 독립적이어야하므로 각 동적 표시 영역마다 서로 다른 ActivityMapper 및 ActivityManager를 설정합니다. 센터, 동 - 위 및 동 - 아래.방법 : UiBinder + GWT MVP + 여러 독립 표시 영역

응용 프로그램이로드 될 때 어떻게이 3 가지 디스플레이 영역을 독립적으로 초기화 할 수 있습니까? 다른 영역에 영향을주지 않고 하나의 표시 영역에서 한 활동에서 다른 활동으로 전환하려면 어떻게합니까?

PlaceController의 goTo를 사용하여 한 영역에서 다른 영역으로 전환 할 때 다른 영역의 활동이 중지됩니다.

Mayday, please may, mayday!

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은 {

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

}

의 EntryPoint를 구현 : 다음

내 코드의 일부입니다

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 Places, PlaceControllerPlaceHistoryMapper을 사용하면 브라우저의 뒤로 버튼과 책갈피가 예상대로 작동하도록 북마크 가능한 URL을 응용 프로그램에서 만들 수 있습니다. 이것은 GWT Place이 설계된 것입니다. 따라서 전체 응용 프로그램에 대해 하나의 URL이 있으므로 어느 시점에서든 응용 프로그램에서 하나 이상의 Place이 활성화되는 것은 의미가 없습니다.

메서드는 등록 된 ActivityManager을 알려주며 PlaceChangeEvent 수신시 현재 활동을 중지합니다.

DockLayoutPanel 동쪽의 두 영역에 PlacePlaceChangeEvent을 사용하지 말아야합니다. 응용 프로그램의 기본 화면에 Place을 사용하십시오. 이는 아마도 DockLayoutPanel의 중심입니다. 동부 지역의 업데이트 할 필요가있는 GwtEvent 유형의 화재, 일반 이벤트 유형 중 하나 (예 : ValueChangeEvent) 또는 맞춤 이벤트 유형. 동쪽에는 여전히 Activitie 초를 사용할 수 있지만 실제로는 그렇게 어렵지는 않지만 자신의 ActivityManager을 만들어야합니다.GWT의 ActivityManager을 복사하고 이름을 바꾼 다음 PlaceChangeEventPlaceChangeRequestEvent을 처리하는 메서드의 이름을 자신의 이벤트를 처리하는 메서드의 이름으로 바꿉니다.

+0

이것은 정확히 제가 한 일입니다. 감사! – Pete

1

당신은 당신이 정말로 구글의 MVP 구현을 사용 하시겠습니까? mvp4g을 사용하여이 메커니즘을 쉽게 구현할 수 없습니다. 메인 모듈은 메인 뷰를 초기화하고 동적 영역을 다시로드하는 로직을 제공합니다. 나는 두 개의 큰 프로젝트에서이 프레임 워크를 사용했고 매력처럼 작동합니다.