我使用GWT MVP和UiBinder创建一个应用程序与DockLayoutPanel。我希望南北码头是静态的,包含按钮和链接。我想在中心和东码头的两个不同区域有动态的视野。由于这些动态区域应该是相互独立的,我正在为每个动态显示区域设置不同的ActivityMapper和ActivityManager;中间,东上,东下
如何在加载应用程序时独立初始化这3个不同的显示区域?如何在一个显示区域从一个活动切换到另一个活动而不影响其他区域?
当我使用PlaceController的goTo在一个区域从一个地方切换到另一个地方时,另一个区域的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>
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);
}
}
GWT Place
s, PlaceController
和PlaceHistoryMapper
使您能够在应用程序中创建可书签的url,从而允许浏览器的后退按钮和书签按预期工作。这就是GWT Place
s的设计目的。因此,由于整个应用程序只有一个URL,因此在任何时候在应用程序中激活多个Place
是没有意义的。
PlaceController
的goTo()
方法通知已注册的ActivityManager
,后者在收到PlaceChangeEvent时停止当前Activity。
我给你的建议是不要使用Place
s和PlaceChangeEvent
s在你的DockLayoutPanel
的东侧的两个区域。使用Place
s作为应用程序的主屏幕,它可能是DockLayoutPanel
的中心。5种不同的GwtEvent
类型,任何一种通用事件类型(例如:ValueChangeEvent
)或自定义事件类型,当您需要更新时,用于东面的区域。您仍然可以在东面使用Activitie
s,但您需要创建自己的ActivityManager
,这实际上并不难。您所要做的就是复制GWT的ActivityManager
,重命名它,并将处理PlaceChangeEvent
s和PlaceChangeRequestEvent
s的方法名称替换为处理您自己的事件的方法名称。
你确定你真的想使用google的mvp实现吗?使用mvp4g实现这种机制非常容易。主模块将负责初始化主视图并提供重载动态区域的逻辑。我在两个大型项目中使用了这个框架,效果非常好。