阅读一段时间并观看Google IO视频后,我仍然对MVP与Activity和Places的关系感到困惑.
我找到了一段时间发布的帖子 - > GWT 2.2 MVP vs. GWT 2.1 Activities-Places
"MVP架构.MVP是概念,其中一个方法就是场所 - 活动框架"
我还听到"演示者类似于活动"
我们可以给出"没有MVP的活动和场所"
我们可以混合"活动和地方与MVP"
"MVP只不过是我们如何组织我们的项目,以便我们可以轻松地测试和组织代码"
然后我想弄清楚这样的东西 - > http://code.google.com/p/gwt-platform/
我真的很困惑.我想要一站式线程来结束所有的混乱.
我正在使用GWT MVP和UiBinder来创建一个带有DockLayoutPanel的应用程序.我希望南北码头是静态的,包含按钮和链接.我希望在中心和东部码头的两个不同区域拥有动态视图.由于这些动态区域应该彼此独立,我为每个动态显示区域设置不同的ActivityMapper和ActivityManager; 中心,东顶和东底.
如何在加载应用程序时独立初始化这3个不同的显示区域?如何在一个显示区域中从一个Activity切换到另一个Activity而不影响其他区域?
当我使用PlaceController的goTo在一个区域中从一个地方切换到另一个地方时,另一个区域的活动停止.
五月天,请帮忙,五月天!
以下是我的一些代码:
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}" …Run Code Online (Sandbox Code Playgroud) 在地方变更上更新活动状态的最佳做法是什么?想象一下,您有一个带有视图的活动,该活动显示类别列表和类别中的项目列表.如果选择了不同的类别,则应用程序将转到具有类别ID的新位置.我想要只刷新项目,而不是创建也重新读取类别列表的新活动.
我目前的做法是这样的:
public class AppActivityMapper implements ActivityMapper {
private ItemListActivity itemListActivity;
...
public Activity getActivity(final Place place) {
final Activity activity;
if (place instanceof ItemListPlace) {
if (itemListActivity == null) {
itemListActivity = new ItemListActivity((ItemListPlace) place, clientFactory);
} else {
itemListActivity.refresh((ItemListPlace) place);
}
activity = itemListActivity;
} else {
itemListActivity = null;
}
...
return activity;
}
...
Run Code Online (Sandbox Code Playgroud) 剥夺演示者从活动中的角色可以获得哪些优势?
为了剖析作为演示者的活动,可以分离哪些角色/关注点?
你为什么要把它们分成两个不同的问题?
在什么情况下不统一它们是否有意义?
举例,利弊.
我终于开始"获得"GWT了.在任何时候,PlaceChangeEvent都可以在应用程序上触发EventBus:
History.newItem("token-for-some-new-place");
Run Code Online (Sandbox Code Playgroud)
这增加了该事件的总线,因此注册ActivityManager舀起来,并咨询其内部ActivityMapper给它Activity与相关PlaceChangeEvent的Place.
所述Activity(类似于从MVP/MVC演示者或控制器对象),则获得所需要的任何数据(通过RPC调用向服务器),并且执行任何业务逻辑和配置的最终视图(通常是Composite某种形式的)来显示.
只要我们谈论的是一个超级简单的GWT应用程序,它的主页上只有一个显示区域,那么就像我说的那样,我"得到"它.
我现在窒息的地方是当你有一个包含多个显示区域的应用程序(可以彼此异步更新的区域)时会发生什么.
所以我问:
ActivityMapper应该是多么精细?是否有一个应用程序范围AppActivityMapper将所有Places 映射到所有的Activity,或者是否应该有某种ActivityMapper层次结构/分解,你有多个映射器?(如果您对此的回答类似于" 这取决于您的应用程序的需求 ",那么请解释哪些要求/需求驱动适当的粒度级别!)Place表示应用中的URL令牌(为了使其成为Place可收藏状态),那么当您拥有一个具有多个显示区域(D1,D2,D3)的更复杂应用时会发生什么.一个URL令牌(即http://myapp.com/#token-for-some-new-place)如何映射到D1,D2和D3?这不意味着ActivityMapper#getActivity必须能够返回一个活动列表(List<Activity>),其start(AcceptsOneWidget, EventBus)方法将被调用吗?感谢您的帮助 - 代码示例总是摇滚.
我知道地方和活动与MVP是分开的.P&A用于管理浏览器历史记录,MVP是一种架构模式.但是,显然,它们在区域中交错和重叠,而这个问题是关于它们如何能够团结一致地协同工作.
我刚刚读了GWT Places&Activites,并推荐了MVP结构,我的头脑正在旋转.我需要有人确认我有基本的想法.
A PlaceHistoryHandler既有a PlaceController又有PlaceHistoryMapper.当您在浏览器地址栏中输入特定URL时,PlaceHistoryHandler使用它PlaceHistoryMapper来确定Place应将其传递给它PlaceController.的PlaceController,反过来,触发一个适当的PlaceChangeEvent到EventBus.
一个或多个ActivityManagers正在总线上监听这些PlaceChangeEvents,并将这些Places 映射到a Activity,这应该是MVP架构中的Presenter组件.
返回的具体Activity(演示者)应该具有实现的模型注入视图(通常是UiBinder)AcceptsOneWidget.AcceptsOneWidget然后启动(via Activity#start(...))此组件,GWT - 自动 - 将其内容呈现给浏览器.
我所说的任何不正确,误导或误解的东西?如果是这样,请纠正我.基于这种理解,很多代码即将编写......
我的每个活动都需要一个对应的单例View实现.将它们注入活动的最佳策略是什么?
构造函数注入 Activity构造函数是从ActivityMapper的getActivity()调用的.ctor已经有一个参数(一个Place对象).我必须创建ActivityMapper,注入所有可能的视图.不好...
方法注入 - "在执行构造函数后自动执行注释的函数." (GWT in Action,2nd Ed.)好吧,"在执行ctor之后"显然不够快,因为当start()调用Activity的方法时,视图(或以这种方式注入的RPC服务)仍未初始化,我得到了一个NPE.
在Activity的ctor中用GWT.create构造注入器.没用,因为他们不再是单身人士.
它终于发生,我认为你应该编写了一个ActivityMapper解析/检查Place,其子类getActivity(Place)方法传递,并返回相应的Activity呈现给用户.
所以这让我思考:Place在你的应用程序中需要许多不同的子类是有道理的,每个子类代表一个不同的可收藏的URL /状态.
但为什么一个应用程序需要超过1 ActivityManager和Activity Mapper?似乎没有GWT强加的限制哪个Place被映射到哪个Activity......
我听说过每个显示区域都有自己的策略ActivityManager.看起来像我这样只是让你的项目更复杂而没有提供任何真正的好处.提前致谢!
我有一个GWT位置/活动Web应用程序.我使用Anchor的click事件将用户移动到一个新的"地方",因此用户无法在新窗口或标签中打开任何"链接".问题是 - 如何让所有这些链接变为现实?
我对 GWT的理解是它首先发布了活动和场所的概念,以支持UI作为状态机的想法,其中每个状态是UI的可书籍配置.
我的理解是GWT后来发布了他们的建议,用MVP架构模式构建GWT应用程序,以便更好地分离关注点和更容易的单元测试.
但是,当你有下载示例应用程序,真正看看源代码,虽然这两个观念培育有client,server和shared封装结构,其内部运行基于不同的理念和不同的核心类型.基本上,似乎你必须在一个或另一个之间做出选择(这是真的吗?).
现在我看到GWTP(GWT平台).这看起来像是活动/地方范例以及MVP设计的完美结合.所以我问:如果我选择使用GWTP,那么在活动/地方或MVP领域有什么我会错过的吗?换句话说,通过使用GWTP,我限制自己并被禁止使用这两个项目中的任何最佳实践或组件?提前致谢!
这之间有什么区别(性能和其他):
public class MyPlaceMapper implements PlaceHistoryMapper {
@Override
public String getToken(Place place) {
if(place instanceof HomePlace)
return "home";
else
return null;
}
@Override
public Place getPlace(String token) {
if(token.equals("home"))
return new HomePlace();
else
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
和:
public class MyPlaceMapper implements PlaceHistoryMapper {
// Singleton HomePlace to inject and reuse over and over again
private HomePlace homePlace;
// Getter/setter for homePlace...
@Override
public String getToken(Place place) {
if(place instanceof HomePlace)
return "home";
else
return null;
}
@Override
public Place …Run Code Online (Sandbox Code Playgroud)