3

I've implemented a basic GWT app based on on the MVP pattern Google recommends. What I'm trying to figure out is the best way to store navigation/history state once you fill your application with data.

Let's say you have a search that returns a bunch data into a CellTable. If I navigate to a specific item in the search result to another panel, the initial Panel with the search result is gone unless the Presenter/View is stored somewhere so I can access it easily on a back navigation.

So, my question is, what do apps like Gmail do to preserve the state for back navigation? Are there any examples of how this can be implemented?

4

3 回答 3

2

Gmail 不使用 GWT,所以我假设您只想要一个高级别的答案。

Gmail 使用 URL 片段(后面的部分#)。当您在 Gmail 中导航时,您会注意到该片段更改为 Gmail 导航中每个“位置”的唯一标识符。使用片段使浏览器为您完成所有跟踪,而无需重新加载页面。然后,您只需监视片段,当它发生变化时,您导航到它指定的位置。

于 2010-12-09T17:43:36.397 回答
1

您在哪里创建活动?您应该返回一个现有活动,而不是在每次地点更改时创建一个新活动。活动通常在ActivityMapper. 你有两个选择:

  1. 更改ActivityMapper以使其Activity在第一次调用时创建一个实例,并在后续调用时返回此实例。或者,

  2. 用来CachingActivityMapper包装你的ActivityMapper. 它将返回一个现有的Activity而不是创建一个新的。

于 2010-12-10T10:15:58.523 回答
1

有几个 GWT MVP 库项目使用 Place 的概念来表示 Presenter 的状态。Place 实现通常将状态映射到 # 之后的 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());
}
}

当 URL 的格式为 /data#state=12345 时,将要求此 Place 根据参数准备 Presenter。之后,Presenter 中的reveal 方法将被调用。由于 Place 已准备好状态,因此您可以根据需要恢复视图。

于 2010-12-09T18:20:50.053 回答