我已根据Google推荐的MVP模式实施了一个基本的GWT应用。我想弄清楚的是,一旦用数据填充应用程序,存储导航/历史状态的最佳方法。
假设您有一个将一堆数据返回到CellTable的搜索。如果我导航到搜索结果中的特定项目到另一个面板,除非Presenter / View存储在某个地方,否则带有搜索结果的初始Panel将会消失,因此我可以在后退导航中轻松访问它。
所以,我的问题是,像Gmail这样的应用程序如何保留状态以进行反向导航?有没有关于如何实施这个的例子?
答案 0 :(得分:2)
Gmail不使用GWT,所以我假设你只想要一个高级答案。
Gmail使用网址片段(#
后面的部分)。当您在Gmail中导航时,您会注意到该片段会更改为Gmail导航中每个“位置”的唯一标识符。使用该片段使浏览器可以为您完成所有跟踪,而无需重新加载页面。然后,您只需监视片段,当它发生更改时,您将导航到它指定的位置。
答案 1 :(得分:1)
GWT有几个MVP库项目,它们使用Place的概念来表示Presenters的状态。场所实现通常将状态映射到#之后的URL片段。因此,它们的工作方式与Gmail的状态处理类似。
例如,使用gwt-presenter项目,您可能拥有DataPresenter和DataPlace:
public class DataPlace extends ProvidedPresenterPlace<DataPresenter> {
@Inject
public DataPlace(Provider<DataPresenter> presenter) {
super(presenter);
}
@Override
public String getName() {
return "data";
}
@Override
protected void preparePresenter( PlaceRequest request, DataPresenter presenter ) {
String state = request.getParameter("state", null);
if (state != null) {
// set the presenter state
presenter.setState(State.valueOf(state));
}
}
@Override
protected PlaceRequest prepareRequest( PlaceRequest request, DataPresenter presenter ) {
return request.with("state", presenter.getState().toString());
}
}
当网址格式为/ data#state = 12345时,系统会要求此地点根据参数准备Presenter。之后,将调用Presenter中的reveal方法。由于该地方已经准备好了州,因此您可以根据需要恢复视图。
答案 2 :(得分:1)
您在哪里创建活动?您应该返回现有活动,而不是每次更改地点时创建新活动。活动通常在ActivityMapper
中创建。您有两种选择:
更改ActivityMapper
,以便在第一次调用时创建Activity
实例,并在后续调用时返回此实例。或者,
使用CachingActivityMapper
打包ActivityMapper
。它将返回现有的Activity
,而不是创建新的。{/ p>