听起来您对这些概念有相当不错的掌握。我已经使用了几次活动/地点 API,但我仍然觉得它有点令人困惑。以下是有关如何考虑组件的另一个概述:
PlaceController - 你用来告诉 ActivityManager 下一步要转换到哪里,使用 goTo。
ActivityManager - 管理正在运行的活动。呼叫开始、停止、显示等。
ActivityMapper - 把它想象成一个工厂。它知道根据给定地点创建什么活动。这是我通常注入我的 RPC 服务的地方。
地点 - 将其视为应用程序中特定视图的“地址”。PlaceTokenizer 通常在此处指定,但这更方便。
PlaceHistoryMapper - 这是将获取 url 令牌的类,并使用您指定的 PlaceTokenizers 创建一个 Place 出来。
Activity - Activity 代码应该能够获取一个 Place 对象,并将您的应用程序带到该位置。如果两个 Place 对象相同,则它们应该每次都显示相同的内容。
这是我编写的使用活动场所的测试应用程序的一个(可能不是很好的)示例。我有两个使用此应用程序的部分:
https ://github.com/aglassman/jgoo/tree/master/JGoo/src/com/jgoo/client/appnav
https://github.com/aglassman/jgoo/树/master/JGoo/src/com/jgoo/client/crud/nav
活动地点设置在这里:
https ://github.com/aglassman/jgoo/blob/master/JGoo/src/com/jgoo/client/CrudLauncher.java
这是正在运行的测试应用程序,您可以看到我使用 PlaceTokenizers 获得不同视图的不同方式。(注意,数据存储有时需要几秒钟来初始化,所以如果你“获取所有”,加载可能需要一段时间(没有加载微调器,但它正在工作)。如果你点击结果文本,它会带你到对象的视图。
http://jgoo-sample.appspot.com/
希望这可以帮助!
更新:添加了 Activity 示例,它如何与 MVP 相关联
在下面的示例中,PlaceTokenizer 提供了一个活动类型,如果请求编辑,则提供一个 UUID 以映射到特定的联系人。我将 Activity 用作高级演示者,几乎只是为低级演示者提供其完成工作所需的初始数据信息。在较低级别的演示者中,在本例中为 RequestEditWidget 和 ContactInfoWidget,我使用 UIBinder 创建视图。请注意,我目前没有办法让活动使用 mayStop / onStop 方法,但这只是与我的小部件交互的一些额外代码。
这些(编辑、订阅、request_edit)中的每一个都可以在它们自己的活动中,但我希望它们都具有相同的位置前缀。
package contactmanager.client.nav;
import contactmanager.client.ContactManagerServiceAsync;
import contactmanager.client.callback.BasicCallback;
import contactmanager.client.contact.info.ContactInfoWidget;
import contactmanager.client.contact.info.RequestEditWidget;
import contactmanager.shared.bundle.InitDataBundle;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
public class ContactActivity extends AbstractActivity{
public enum Activity {
request_edit,
edit,
subscribe
}
private ContactManagerServiceAsync cmsa;
private ContactPlace place;
private PlaceController pc;
public ContactActivity(PlaceController pc, ContactManagerServiceAsync cmsa,ContactPlace place)
{
this.pc = pc;
this.cmsa = cmsa;
this.place = place;
}
public void start(AcceptsOneWidget panel, EventBus eventBus) {
switch(place.activity)
{
case request_edit:
loadRequestEditPanel(panel);
break;
case edit:
loadEditPanel(panel);
break;
case subscribe:
loadSubscribePanel(panel);
break;
}
}
private void loadSubscribePanel(final AcceptsOneWidget panel) {
cmsa.getInitDataBundle(new BasicCallback<InitDataBundle>() {
@Override
public void onSuccess(InitDataBundle result) {
panel.setWidget(new ContactInfoWidget(pc,cmsa,result,null).getWidget());
}
});
}
private void loadRequestEditPanel(final AcceptsOneWidget panel) {
panel.setWidget(new RequestEditWidget(pc,cmsa).getWidget());
}
private void loadEditPanel(final AcceptsOneWidget panel) {
cmsa.getInitDataBundle(new BasicCallback<InitDataBundle>() {
public void onSuccess(InitDataBundle result) {
panel.setWidget(new ContactInfoWidget(pc,cmsa,result,place.uuid).getWidget());
}
});
}
}