嗨,我是 GWT MVP 模式的新手。我来自 asp.net 背景,目前我正在研究 GWT,我被要求创建一个母版页,其中包含所有视图应该共有的菜单项。最初,我使用https://developers.google.com/web-toolkit/articles/mvp-architecture-2创建了一个示例 mvp 项目,并且可以从一个视图导航到另一个视图。如何保持一个视图不变并根据我们单击的菜单项不断更改其他视图。请帮忙
3 回答
您将屏幕划分为两个或更多区域,并为每个区域分配专用的 ActivityMapper 和 ActivityManager。例如,一个区域可以是带有 MenuActivityManager 的“菜单”,而另一个区域可以是带有 BodyActivityManager 的“body”。
这是一个很好的解释: http ://blog.ltgt.net/gwt-21-activities-nesting-yagni/
请注意,使用此方法有利也有弊。浏览器需要几毫秒来呈现标准的 html。创建一个小部件 mainMenu 并将它(最好是使用 UiBinder)包含到每个视图中可能会更容易,而不是处理两个活动管理器。
您提到的文章来自在 GWT 中添加 MVP 支持之前。它擅长解释概念,但实际实现用处不大。要继续查看有关活动的 GWT 文档:https ://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces 。在那里,您还将找到解决问题的方法。简而言之,看看ActivityManager
. 这管理所有活动。在活动管理器上,您设置一个对所有活动都是静态的小部件。这个小部件必须有一个方法setWidget
(实际上它必须实现AcceptsOneWidget
)。在您的每个活动实现中,您都可以通过start
方法。通过在 start 方法中使用该活动的特定视图调用 setWidget,您可以设置活动特定视图。这一切都非常简要地描述,但如果您阅读提到的文档,您应该了解这个概念。
如果您正在使用UiBinder
,您的ui.xml
文件应该是这样的,
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:style>
</ui:style>
<g:DockLayoutPanel unit="EM">
<g:north size="4">
//Add Logo, menus or what you want to be displayed for all the pages
</g:north>
<g:center>
//Add code for your desired UI. In java code you change the UI by this "flowpanel"
For eg: <g:FlowPanel ui:field="flowpanel" />
</g:center>
</g:DockLayoutPanel>
<g:center>
然后,每次您都可以像这样使用您的 java 代码清除并添加要在视图中显示的小部件flowpanel.clear();
flowpanel.add(anyWidget you need)
。
<g:north>
静态视图和动态视图也是如此<g:center>
。现在您将获得所需的页面。因为您每次只能更改您的视图<g:center>
。
像这样,您可以添加<g:east>
,如果需要。<g:west>
g:south>
如果您不使用 UiBinder,请在您的 java 代码中执行以下操作,
final DockLayoutPanel dockLayoutPanel = new DockLayoutPanel(Style.Unit.EM);
dockLayoutPanel.addNorth(any widget you need, "4"); //NorthPanel
dockLayoutPanel.add(any widget you need); //CenterPanel
"4"
面板的大小在哪里,你可以改变它。
像这样dockLayoutPanel.addWest(any widget you need, "4"); //WestPanel
dockLayoutPanel.addEast(any widget you need, "4");//EastPanel
dockLayoutPanel.addSouth(any widget you need, "4"); //SouthPanel
我希望你现在明白了。