Sobre la base de la respuesta por @dominik hice algunas mejoras, veo mi Gist. Contiene algunas clases base abstractas que se pueden usar para cualquier implementación Modal/PopupView. Es un poco más complejo pero también más limpio porque no pasamos el Presenter
completo al View
. La interfaz para la View
para interactuar con el Presenter
cuando el modal está cerrado es HasModalUnbind
.
Se podría utilizar estas clases de la siguiente manera. Ejemplo presentador:
public class ErrorModalPresenter extends ModalPopupPresenter<ErrorModalPresenter.MyView> {
public interface MyView extends ModalPopupView {
DivElement getErrorMessage();
}
private final ErrorEvent error;
@Inject
public ErrorModalPresenter(final EventBus eventBus,
final MyView view,
@Assisted final ErrorEvent error) {
super(eventBus, view);
this.error = error;
}
@Override
public void unbindModal() {
ErrorDismissEvent.fire(this, this);
}
@Override
protected void onBind() {
super.onBind();
//noinspection ThrowableResultOfMethodCallIgnored
getView().getErrorMessage().setInnerText(error.getCause().getMessage());
}
}
Ejemplo vista:
public class ErrorModalView extends ModalPopupViewImpl implements ErrorModalPresenter.MyView {
@UiField(provided = true)
Modal errorModal;
@UiField
DivElement errorMessage;
interface Binder extends UiBinder<Widget, ErrorModalView> {}
@Inject
public ErrorModalView(final EventBus eventBus,
final Binder uiBinder) {
super(eventBus);
errorModal = initModal();
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public DivElement getErrorMessage() {
return errorMessage;
}
}
Y el XML UiBinder sólo para el registro:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:b='urn:import:com.github.gwtbootstrap.client.ui'>
<b:Modal ui:field='errorModal' title='Error'>
<g:HTML>
<div ui:field='errorMessage'/>
</g:HTML>
<b:ModalFooter>
<b:Button text='Close' dismiss='MODAL'/>
</b:ModalFooter>
</b:Modal>
</ui:UiBinder>
En unbindModal()
de ErrorModalPresenter
I desencadenar un evento que se captura por el padre Presentador de ErrorModalPresenter
. Allí, el presentador modal se elimina de un contenedor y luego se llama al unbind()
en el presentador. Por supuesto, cualquier otra solución es posible en unbindModal()
.
Las clases de base asumen que los modales son modales de un solo uso que se eliminarán una vez que están ocultos. Este comportamiento se puede cambiar en initModal() de ModalPopupViewImpl
.
Los desarrolladores suelen ser muy receptivos a las preguntas formuladas en sus foros: https://groups.google.com/forum/#!forum/gwt-bootstrap –