Сохранение состояния навигации / истории в GWT с шаблоном MVP

Я реализовал базовое приложение GWT на основе шаблона Google MVP. рекомендует. Я пытаюсь понять, как лучше всего сохранить состояние навигации / истории после того, как вы заполните свое приложение данными.

Допустим, у вас есть поиск, который возвращает кучу данных в CellTable. Если я перейду к определенному элементу в результатах поиска на другую панель, исходная панель с результатом поиска исчезнет, ​​если Presenter / View не хранится где-то, поэтому я могу легко получить к нему доступ с помощью обратной навигации.

Итак, мой вопрос: что делают приложения, такие как Gmail, для сохранения состояния для обратной навигации? Есть ли примеры, как это можно реализовать?


person stuff22    schedule 09.12.2010    source источник


Ответы (3)


Gmail не использует GWT, поэтому я предполагаю, что вам просто нужен высокоуровневый ответ.

Gmail использует фрагмент URL-адреса (часть после #). Во время навигации в Gmail вы заметите, что фрагмент меняется на уникальный идентификатор для каждого «местоположения» в навигации Gmail. Использование фрагмента заставляет браузер выполнять все отслеживание за вас, не требуя перезагрузки страницы. Затем вы просто отслеживаете фрагмент, и когда он изменяется, вы переходите в указанное место.

person Laurence Gonsalves    schedule 09.12.2010
comment
Да, я это видел. Но я также заметил, что иногда он кэширует результат, а иногда возвращается и загружает его, когда вы возвращаетесь. Итак, если бы вы преобразовали это поведение в приложение GWT, как бы оно выглядело. Можно ли кэшировать презентаторов на клиенте в каком-то виде Hashmap и на основе токена истории извлекать их с карты с сохраненным состоянием? У меня есть несколько идей, как это сделать, я просто хотел бы знать, есть ли более приемлемый / лучший способ сделать это, прежде чем я начну его реализовывать. - person stuff22; 09.12.2010
comment
По умолчанию браузер не выполняет принудительную перезагрузку. Вам нужно будет предоставить логику, которая определяет, обновляется дисплей или нет. Это хороший способ делать что-то - вперед и приступайте к его реализации! - person Riley Lark; 09.12.2010

Существует несколько проектов библиотеки MVP для GWT, в которых используется концепция места для представления состояния докладчиков. Реализации размещения обычно сопоставляют состояние с фрагментом 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-адрес имеет вид form / data # state = 12345, это место будет предложено подготовить Presenter на основе параметров. После этого будет вызван метод открытия в Presenter. Поскольку состояние уже было подготовлено местом, вы сможете восстановить вид по мере необходимости.

person LeonT    schedule 09.12.2010
comment
Думаю, я немного сбит с толку, почему мне нужно использовать отдельную библиотеку для MVP, когда GWT 2.1 уже реализует этот шаблон. Какая разница между двумя? Я бы предположил, что это можно было бы решить без использования внешней библиотеки. - person stuff22; 09.12.2010
comment
Это пример из более старого кода 1.7. Я еще не касался 2.1, так что вы можете найти там что-нибудь получше. :) - person LeonT; 09.12.2010

Где вы создаете действия? Вы должны возвращать существующее действие вместо создания нового каждый раз, когда место меняется. Действия обычно создаются в ActivityMapper. У вас есть два варианта:

  1. Измените ActivityMapper так, чтобы он создавал экземпляр Activity при первом вызове и возвращал этот экземпляр при последующих вызовах. Или,

  2. Используйте _4 _ завернуть свой ActivityMapper. Он вернет существующий Activity вместо создания нового.

person Peter Knego    schedule 10.12.2010