Tengo un formulario dentro de un p:dialog componente que va a ser presentado a través de AJAX. La forma en que el diálogo sea a través de un ui:include de otro .xhtml que solo contiene el formulario y sus componentes (no, no estoy de anidación de las formas; el diálogo en sí no está dentro de ninguna forma). La página del backing bean es ‘ViewScoped’.

La MAYORÍA de las cosas funcionan bien:

  • En el éxito de la validación, la forma de ejecutar el método save; después de una exitosa guardar, el diálogo se cierra; la apertura de un registro posterior muestra el adecuado registro de la información de la base de datos.
  • Sin éxito de validación, el enviado persisten valores y el diálogo sigue abierto y muestra los errores de validación, la fijación de los campos no válidos y volver a presentar los resultados en un éxito en guardar.

El problema viene cuando el action llamado por el p:commandButton falla. En el caso de que se produce un error, el cuadro de diálogo permanece abierto y muestra «Error al guardar cambios» a través de h:messages para el usuario; además, los valores enviados aún persisten en los campos de entrada. Esto está bien (e incluso deseable) mientras que la forma queda abierta, sin embargo-al cerrar el cuadro de diálogo y volver a abrirlo, los valores enviados TODAVÍA están en los campos de texto. Esto es malo porque se le da al usuario la impresión de que el guardar tuvo éxito (como la h:messages componente está en blanco debido a que el cuadro de diálogo de actualización).

Hasta ahora he probado el siguiente, NINGUNO de los cuales han remediado el problema:

  • 1.1) Configuración de la copia de frijol de la incluyó forma a una nueva instancia del bean en el cuadro de diálogo abrir.
  • 1.2), Ya que el grano es ahora una nueva instancia, yo también soy de repoblación, la dirección del objeto con la información de datos de frijol.
  • 2.1) Deshabilitar el botón cerrar en el cuadro de diálogo y la adición de un p:commandButton botón «Cancelar» con un p:resetInput componente en
    para cerrar el cuadro de diálogo o restablecer el formulario. (cuadro de diálogo se cierra, pero sometido
    los valores en forma persisten).
  • 2.2) se llama a un método de este p:commandButton que quita el RequestMap el formulario de respaldo de frijol.
  • 2.3) Probado con el botón de ajuste a ambos immediate=true y immediate=false.
  • 2.4) Probado con el botón de ajuste a [email protected], una táctica similar que he utilizado para cerrar un formulario para asegurarse de que se han fresco campos en
    reapertura.

Que usted podría pensar que entre la configuración de la copia de frijol a una nueva instancia, y la repoblación de la dirección objeto me gustaría ver de una forma fresca, pero NOPE.

Aquí es algunos de los fuente:

Parte de mainform.xhtml

    <p:dialog id="dlgAddress"
              header="Address Edit"
              widgetVar="dialogAddress"
              dynamic="true"
              modal="false"
              closable="false"
              resizable="false"
              styleClass="dlgAddress"
              visible="#{addressform.showDlgAddress}">
        <ui:include src="addressform.xhtml"/>
    </p:dialog>

addressform.xhtml

<h:form id="fDlgAddress">
<div id="addresses-container">
<h:messages id="msgDlgAddress" errorClass="errormsg" infoClass="infomsg1" layout="table"/>
<h:panelGrid columns="1"
styleClass="pgAddresses"
rendered="#{!addressform.address.exists}">
<h:outputText value="No active #{addressform.address.atypCode} address found."
styleClass="record-not-exists"/>
<h:outputText value="Use the form below to create one."/>
</h:panelGrid>
<p:panelGrid columns="2"
styleClass="pgDlgForm pgAddresses">
<h:outputLabel value="Address Type"/>
<h:inputText id="atypCode1"
value="#{addressform.address.atypCode}"
disabled="true"
rendered="#{addressform.address.exists}"/>
<h:selectOneMenu id="atypCode2"
value="#{addressform.address.atypCode}"
rendered="#{!addressform.address.exists}">
<f:selectItems value="#{addressform.atypCodeList}"
var="atyp"
itemValue="#{atyp}"
itemLabel="#{atyp}"/>
</h:selectOneMenu>
<h:outputLabel value="Street 1" 
for="street1"/>
<h:inputText id="street1"
value="#{addressform.address.addressLine1}"/>
<h:outputLabel value="Street 2" 
for="street2"/>
<h:inputText id="street2"
value="#{addressform.address.addressLine2}"/>
<h:outputLabel value="Street 3" 
for="street3"/>
<h:inputText id="street3"
value="#{addressform.address.addressLine3}"/>
<h:outputLabel value="Street 4" 
for="street4"/>
<h:inputText id="street4"
value="#{addressform.address.addressLine4}"/>
<h:outputLabel value="City" 
for="city"/>
<h:inputText id="city"
value="#{addressform.address.city}"
required="true"
requiredMessage="Please enter a city."/>
<h:outputLabel value="State" 
for="statCode"/>
<h:selectOneMenu id="statCode"
value="#{addressform.address.stateCode}">
<f:selectItem itemLabel="Select State/Province"
itemValue=""/>
<f:selectItems value="#{states.statesList}"
var="stat"
itemValue="#{stat.statCode}"
itemLabel="#{stat.statDesc}"/>
</h:selectOneMenu>
<h:outputLabel value="Zip Code" 
for="zipCode"/>
<h:inputText id="zipCode"
value="#{addressform.address.zip}"/>
<h:outputLabel value="Country" 
for="natnCode"/>
<h:selectOneMenu id="natnCode"
value="#{addressform.address.nationCode}"
required="true"
requiredMessage="Please choose a nation.">
<f:selectItem itemLabel="Select Country"
itemValue=""/>
<f:selectItems value="#{nations.nationsList}"
var="natn"
itemValue="#{natn.natnCode}"
itemLabel="#{natn.natnDesc}"/>
</h:selectOneMenu>
<h:outputLabel value="From Date" 
for="fromDate"/>
<p:calendar id="fromDate"
value="#{addressform.address.fromDate}"
showButtonPanel="true"/>
<h:outputLabel value="To Date" 
for="toDate"/>
<p:calendar id="toDate"
value="#{addressform.address.toDate}"
showButtonPanel="true"/>
<h:outputLabel value="Inactivate"
for="inactivateAddress"
rendered="#{addressform.address.exists}"/>
<h:selectBooleanCheckbox id="inactivateAddress"
value="#{addressform.address.inactivate}"
rendered="#{addressform.address.exists}"/>
<h:outputLabel value="Delete"
for="deleteAddress"
rendered="#{addressform.address.exists}"/>
<h:selectBooleanCheckbox id="deleteAddress"
value="#{addressform.address.delete}"
rendered="#{addressform.address.exists}"/>
</p:panelGrid>
</div>
<div class="button-container">
<p:commandButton value="Save Changes"
action="#{addressform.save}"
type="submit"
ajax="true"
process="@form"
update="@form"/>
<p:commandButton value="Cancel"
process="@this"
onclick="dialogAddress.hide();">
<p:resetInput target="fDlgAddress"/>
</p:commandButton>
</div>
</h:form>

Recorddetailsform (backing bean de formulario desde el cual la dirección de diálogo se llama)

public void showDlgAddress(){
FacesContext ctx = FacesContext.getCurrentInstance();
ELResolver resolver = ctx.getApplication().getELResolver();
RecordDetails recordDetails = (RecordDetails) resolver.getValue(ctx.getELContext(), null, "recordDetails");
//Set addressform backing bean to new instance and load address into it from recordDetails
resolver.setValue(ctx.getELContext(), null, "addressform", new Addressform());
Addressform addressform = (Addressform) resolver.getValue(ctx.getELContext(), null, "addressform");
addressform.setAddress(recordDetails.getAddress());
}

Addressform (formulario de dirección de respaldo del bean)

public void save() {
FacesContext ctx = FacesContext.getCurrentInstance();
RequestContext rctx = RequestContext.getCurrentInstance();
ELResolver resolver = ctx.getApplication().getELResolver();
Records records = (Records) resolver.getValue(ctx.getELContext(), null, "records");
RecordDetails recordDetails = (RecordDetails) resolver.getValue(ctx.getELContext(), null, "recordDetails");
Mainform mainform = (Mainform) resolver.getValue(ctx.getELContext(), null, "mainform");
Person person = (Person) resolver.getValue(ctx.getELContext(), null, "person");
//Pretty lengthy SQL stuff here. Commented out. Just wanted to display the display logic below for the dialog.
if (errorMsg != null) {//If errorMsg is not null, then error occurred.
showDlgAddress = true;//Ensures address dialog remains open in event of action error.
queueErrorMessage(errorMsg);
rctx.update("dlgAddress");
return;//break out of method on error.
} else {
showDlgAddress = false;
rctx.update("dlgAddress");
}
//If everything saves without error, repopulate address and update recordDetails dialog.
recordDetails.populateAddress(records.getSelectedRecord());
mainform.updateDlgRecordDetails();
}

Otra Información:

  • JSF2
  • Primefaces 3.5
  • Tomcat 6.0
  • Netbeans

OriginalEl autor mousouchop | 2013-04-26

1 Comentario

  1. 14

    Intente esto:

    1. Poner el cuadro de diálogo dentro de un formulario (dialogInputForm)

    2. Agregar el atributo update=»:dialogInputForm»

    3. Nido de la resetInput etiqueta en el botón que abre el cuadro de diálogo y especifique el destino como el que acaba de crear de forma

    El control commandButton:

    <p:commandButton process="@this" actionListener="#{bean.prepare}" update=":dialogInputForm" oncomplete="thirdPartyDialog.show()" value="Open Input Dialog" >
    <p:resetInput target=":dialogInputForm" />
    </p:commandButton>

    Y el formulario que contiene el cuadro de diálogo

    <h:form id="dialogInputForm" >
    ... your dialog ...
    </h:form>
    Hmmm… puedo intentar esta mañana en el trabajo, pero creo que ya he intentado esto. El resultado fue la p:resetInput causado el formulario para aparecer como si el registro se ha cargado, eliminando no sólo el «pegado» presentó los valores del registro anterior a clara, pero también los valores de los nuevos entrantes registro.
    Increíblemente esta solución funciona! Yo estaba desesperada acerca de este problema de restablecimiento de los valores de mis cuadros de diálogo. El <p:resetInput target=":dialogInputForm"/> hace el truco. Muchas gracias!
    Sí. He encontrado que esto funciona de forma fiable. Yo, sin embargo, hacer nido en mi forma dentro de mi cuadro de diálogo, que no parece causar un problema. Creo que mi problema vino cuando inicialmente trató de usar @form como destino para <p:resetInput/>. DEBE usar un formulario de IDENTIFICACIÓN en este componente, y también la actualización de la misma forma como en el ejemplo anterior. Gracias.
    Probado, funciona sólo si el objetivo es en realidad una forma, no funciona si se trata de un compuesto del componente de identificación de cliente (docs decir que cualquier padre componente de trabajo). Triste. Voy a tener que concat id y el código sería frágil en algún momento. Pero por ahora lo voy a hacer.

    OriginalEl autor Rafael Companhoni

Dejar respuesta

Please enter your comment!
Please enter your name here