GWTP Presenter prepareFromRequest - загрузка данных в форму, полученную из события

Я пробовал GWTP в течение последних нескольких недель и строил с ним небольшой проект.

Вот вопрос:

I have a grid widget (attached screenshot) which shows a list of data. On selection of a checkbox of a row and clicking on Edit Request, I get into a detail page. Summary Page

Поскольку у меня есть все данные (модель), которые будут показаны на странице подробностей в самом представлении итогового экрана, я не хочу снова извлекать его из базы данных.

Итак, я сделал следующее:

  1. При выборе и нажатии на запрос редактирования я получаю выбранную модель
  2. Сделать запрос места на страницу сведений
  3. Оставьте событие редактирования и передайте выбранную модель в качестве параметра.

Я понимаю, что делаю это неправильно, потому что, когда я выбираю элемент и нажимаю Edit Request , страница подробностей пока не получает выделенный элемент. Он просто показывает пустую страницу без заполнения данных (очевидно, потому что место было достигнуто задолго до того, как событие было запущено).

Текущий код:

RequestModel selectedItem = getView().getGrid().getSelectionModel().getSelectedItem();

PlaceRequest placeRequest=new PlaceRequest(NameTokens.initiationedit);  
getEventBus().fireEvent(new RequestEditEvent(selectedItem, PHASE_INITIATION));

placeManager.revealPlace(placeRequest);

Personally thought solution : Instead of firing an event, I could make a placerequest with a parameter of the selected item's id and then override the useManualReveal and the prepareFromRequest to fetch data fresh from database.

Но есть ли способ избежать вызова базы данных для ранее существовавших данных.

4
nl ja de

2 ответы

  1. Если вы хотите сохранить текущее решение «RequestEditEvent», убедитесь, что используете @ProxyEvent (см. http://code.google.com/p/gwt-platform/wiki/GettingStarted?tm=6#Attaching_events_to_proxies ).

  2. Другая возможность может заключаться в том, чтобы инвертировать направление события: в своем презентаторе данных запустите событие, которое запрашивает данные у ведущего обзора.

  3. Однако при использовании одних и тех же данных для нескольких презентаторов может быть хорошей идеей хранить данные в центральной модели: создать класс модели (@Singleton) и ввести его везде, где это необходимо. Затем вы можете выполнить поиск (по id) из этой локальной модели, а не запрашивать сервер. В этом случае вам не нужны никакие события - только где-нибудь, например. как параметр места или даже как «currentItemId» в модели.

1
добавлено
Пятно на. Я использовал ProxyEvent и работал как шарм. Ради полноты, позвольте мне также добавить детали
добавлено автор Arun Manivannan, источник

Основываясь на ответе @Chris Lercher, я использовал ProxyEvent. Подробности реализации заключаются в следующем.

В моем RequestEditPresenter (презентаторе данных) я применил обработчик событий RequestEditHandler , как в

public class RequestEditPresenter extendsPresenter implements RequestEditHandler{

то в том же RequestEditPresenter переопределяет метод в RequestEditHandler , как в

@Override
@ProxyEvent
public void onRequestEdit(RequestEditEvent event) {

    getView().setModelToView(event.getRequestModel());

    ...various other initiation process...

    placeManager.revealPlace(new PlaceRequest(NameTokens.initiationedit));
}

Поскольку презентатор Details был Place , я использовал placeManager. Для докладчиков, которые не имеют NameToken , просто вызовите метод forceReveal()

0
добавлено