Я столкнулся с этой же проблемой в нескольких разных приложениях GWT, которые я разработал с использованием подхода Рей Райана. Мое предпочтительное решение - создать «объект сеанса» Singleton, который сохраняет состояние этой части приложения. В вашем примере, это может выглядеть следующим образом:
interface EditPersonSession {
void fetchPerson(PersonId id);
PersonDetails getCurrentPersonDetails();
void updatePersonDetail(PersonDetail<?> detail);
void updatePetDetail(PetDetail<?> detail);
void updateAddressDetail(AddressDetail<?> detail);
void save();
}
Все три Ведущих содержит ссылку на объект сессии (возможно, впрыскиваемый Gin). Всякий раз, когда пользовательский интерфейс (представление) манипулируется пользователем, ведущий, связанный с этим представлением, немедленно подталкивает состояние к общему объекту сеанса. Например, внутри EditAddressPresenter:
view.getStreetNameTextBox().addValueChangeHandler(new ValueChangeHandler() {
void onValueChange(ValueChangeEvent<String> event) {
editPersonSession.updateAddressDetail(new StreetNameAddressDetail(event.getValue()));
}
}
Когда пришло время, чтобы сохранить, состояние объекта сказал, чтобы сохранить состояние на сервере. На этом этапе объект сеанса имеет обновленные представления данных и может сохранить его все сразу. Так, в EditPersonPresenter:
view.getSaveButton().addClickHandler(new ClickHandler() {
void onClick(ClickEvent event) {
editPersonSession.save();
}
}
Таким образом, ведущие не должны содержать ссылки друг на друга, но может послать последовательную информацию на сервер. Если ведущие должны знать, когда информация, отображаемая ими, была обновлена (либо другими ведущими, либо сервером), объект сеанса может уведомить об этом, активировав события на шине событий (общий Singleton HandlerManager). Ведущие могут вытащить из текущего объекта самые последние PersonDetails.
Хм .. Интересное решение. Я не сумасшедший, так это тот факт, что мне нужно будет регистрировать обработчики изменения значений для всех элементов, которые могут не получить мне представление моментального снимка диалога, как если бы я получал значения при выполнении вызова метода editPersonSession.save() , Но я думаю, что так и будет. Благодаря! :) – Arthur
Без проблем :). Пока вы убедитесь, что вы нажимаете значения от докладчиков на объект сеанса, как только изменяется какое-либо значение в представлениях, объект сеанса должен всегда иметь обновленное представление данных в представлениях при вызове спасти(). – Daniel