8

我正在使用 GWT MVP 和 UiBinder 创建一个带有 DockLayoutPanel 的应用程序。我希望南北码头是静态的,包含按钮和链接。我想在中心和东码头的两个不同区域拥有动态视图。由于这些动态区域应该是相互独立的,所以我为每个动态显示区域设置了不同的 ActivityMapper 和 ActivityManager;中、东上、东下。

加载应用程序时如何独立初始化这3个不同的显示区域?如何在一个显示区域从一个 Activity 切换到另一个而不影响其他区域?

当我使用 PlaceController 的 goTo 在一个区域从一个 Place 切换到另一个 Place 时,另一个区域的 Activity 会停止。

求救,求救,求救!

以下是我的一些代码:

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>

我的模块.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);
}

}

应用控制器.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);
    }
}
4

2 回答 2

7

GWT PlacePlaceControllerPlaceHistoryMapper使您能够在应用程序中创建可添加书签的 URL,从而允许浏览器的后退按钮和书签按预期工作。这就是 GWTPlace的设计目的。Place因此,在任何时间点在应用程序中激活多个是没有意义的,因为整个应用程序都有一个 URL。

PlaceControllergoTo()方法会通知已注册的ActivityManager,它会在接收到 PlaceChangeEvent 时停止当前的 Activity。

我对你的建议是不要在你的东侧的两个区域使用Places 和s 。将s 用作应用程序的主屏幕,这可能是. 当您需要更新东侧的区域时,触发不同的类型,可以是通用事件类型之一(即。 )或自定义事件类型。您仍然可以将s 用于东侧,但您需要创建自己的 s ,这实际上并不难。您所要做的就是复制 GWT ,重命名它,并将处理s 和s 的方法的名称替换为处理您自己的事件的方法的名称。PlaceChangeEventDockLayoutPanelPlaceDockLayoutPanelGwtEventValueChangeEventActivitieActivityManagerActivityManagerPlaceChangeEventPlaceChangeRequestEvent

于 2011-11-25T22:17:58.507 回答
1

你确定你真的要使用谷歌的 mvp 实现吗?使用mvp4g实现这种机制很容易失败。主模块将负责初始化主视图并提供重新加载动态区域的逻辑。我在两个大型项目中使用了这个框架,效果很好。

于 2011-11-24T09:46:26.140 回答