He enfrentado este mismo problema en algunas aplicaciones diferentes de GWT que he diseñado utilizando el enfoque de Ray Ryan. Mi solución preferida es crear un "objeto de sesión" de Singleton que almacene el estado de esa parte de la aplicación. En su ejemplo, podría tener este aspecto:
interface EditPersonSession {
void fetchPerson(PersonId id);
PersonDetails getCurrentPersonDetails();
void updatePersonDetail(PersonDetail<?> detail);
void updatePetDetail(PetDetail<?> detail);
void updateAddressDetail(AddressDetail<?> detail);
void save();
}
Los tres presentadores contienen una referencia al objeto de sesión (tal vez inyectado por Gin). Siempre que el usuario manipule la interfaz de usuario (vista), el presentador asociado con esa vista inmediatamente empuja el estado hacia el objeto de sesión compartido. Por ejemplo, en el interior EditAddressPresenter:
view.getStreetNameTextBox().addValueChangeHandler(new ValueChangeHandler() {
void onValueChange(ValueChangeEvent<String> event) {
editPersonSession.updateAddressDetail(new StreetNameAddressDetail(event.getValue()));
}
}
Cuando es el momento de guardar, el objeto de estado se le dice que guardar el estado al servidor. En este punto, el objeto de sesión tiene representaciones actualizadas de los datos y puede guardarlo todo de una vez. Así, en EditPersonPresenter:
view.getSaveButton().addClickHandler(new ClickHandler() {
void onClick(ClickEvent event) {
editPersonSession.save();
}
}
De esta manera, los presentadores no necesita contener ninguna referencia a unos de otros, pero pueden enviar información consistente con el servidor. Si los presentadores necesitan saber cuándo se ha actualizado la información que muestran (ya sea por otros presentadores o por el servidor), el objeto de sesión puede notificarlos activando eventos en el bus de eventos (Singleton HandlerManager compartido). Los presentadores pueden extraer los PersonDetails más actuales del objeto de la sesión.
Hmm ... Solución interesante. Lo que no me entusiasma es el hecho de que necesitaré registrar manejadores de cambios de valor para todos los elementos que pueden no obtener una representación instantánea del diálogo como si tuviera que obtener los valores al hacer la llamada al método editPersonSession.save() . Pero supongo que será suficiente. ¡Gracias! :) – Arthur
No hay problema :). Siempre que se asegure de pasar los valores de los presentadores al objeto de sesión tan pronto como cambie cualquier valor en las vistas, el objeto de sesión siempre debe tener una representación actualizada de los datos en las vistas cuando llame salvar(). – Daniel