2012-08-02 13 views
5

Tengo un cuadro de diálogo de las principales en el que puedo crear o actualizar un empleado. Se abrirá por estaSin actualización de campos después del error de validación

</p:dialog><p:dialog id="employeeEditDialog" header="#{msg.employeeEdit}" 
     widgetVar="dlgEmployeeEdit" resizable="false"> 

     <p:ajax event="close" listener="#{employeeView.cancel}" 
       update=":showEmployees:liste" /> 

     <ui:include src="/content/Employee/ShowEmployeeContent.xhtml" /> 
    </p:dialog> 

Y aquí está el Diálogo de

<h:form id="editContent"> 
<p:growl id="growl" showDetail="true" sticky="false" life="5000" /> 
<p:focus id="focusEdit" for="emSalutation" /> 
<h:panelGrid columns="2" id="contentGrid"> 
    <h:panelGrid columns="2" id="allgemein">               <h:outputText value="#{msg.id}" /> 
     <h:outputText value="#{employeeView.newEmployee.id}" /> 

     <h:outputText value="#{msg.salutation}" /> 
     <p:selectOneMenu value="#{employeeView.newEmployee.salutation}" 
      id="emSalutation"> 
      <f:selectItem itemLabel="" itemValue="" /> 
      <f:selectItems value="#{employeeView.salutations}" var="salutations" 
       itemLabel="#{salutations.description}" itemValue="#{salutations}" /> 
     </p:selectOneMenu> 

     <h:outputText value="#{msg.title}" /> 
     <p:inputText value="#{employeeView.newEmployee.title}" id="emTitle" /> 

     <h:outputText value="#{msg.name}" /> 
     <p:inputText value="#{employeeView.newEmployee.name}" id="emName" 
      validatorMessage="#{msg.valName}" /> 

     <h:outputText value="#{msg.prename}" /> 
     <p:inputText value="#{employeeView.newEmployee.prename}" 
      id="emPrename" /> 

     <h:outputText value="#{msg.loginname}" /> 
     <p:inputText value="#{employeeView.newEmployee.loginname}" 
      validatorMessage="#{msg.valLogin}" /> 

     <h:outputText value="#{msg.department}" /> 
     <h:panelGrid columns="2" id="departmentGrid"> 
      <p:selectOneMenu value="#{employeeView.selectedDepartment.id}" 
       id="emDepartment"> 
       <f:selectItem itemLabel="" itemValue="" /> 
       <f:selectItems value="#{employeeView.departmentList}" 
        var="department" itemLabel="#{department.description}" 
        itemValue="#{department.id}" /> 
      </p:selectOneMenu> 
      <p:commandButton icon="ui-icon-disk" immediate="true" 
       oncomplete="dlgDepartmentAdd.show()" 
       update="departmentGrid, :departmentAddDialog"> 
      </p:commandButton> 
     </h:panelGrid> 

     <h:outputText value="#{msg.position}" /> 
     <h:panelGrid columns="2" id="positionGrid"> 
      <p:selectOneMenu value="#{employeeView.selectedPosition.id}" 
       id="emPosition"> 
       <f:selectItem itemLabel="" itemValue="" /> 
       <f:selectItems value="#{employeeView.positionList}" var="position" 
        itemLabel="#{position.description}" itemValue="#{position.id}" /> 
      </p:selectOneMenu> 
      <p:commandButton icon="ui-icon-disk" immediate="true" id="buttonPos" 
       oncomplete="dlgPositionAdd.show()" 
       update="positionGrid, :positionAddDialog"> 
      </p:commandButton> 
     </h:panelGrid> 

     <h:outputText value="#{msg.phone}" /> 
     <p:inputText value="#{employeeView.newEmployee.phone}" id="emPhone" /> 

     <h:outputText value="#{msg.fax}" /> 
     <p:inputText value="#{employeeView.newEmployee.fax}" id="emFax" /> 

     <h:outputText value="#{msg.email}" /> 
     <p:inputText value="#{employeeView.newEmployee.email}" id="emEmail" 
      validator="myEmailValidator" validatorMessage="#{msg.valEmail}" /> 

     <h:outputText value="#{msg.employeedSince}" /> 
     <p:calendar value="#{employeeView.newEmployee.employeedSince}" 
      id="emEmployeedSince" pattern="dd.MM.yyy" showOn="button" /> 

     <h:outputText value="#{msg.employeedEnd}" /> 
     <p:calendar value="#{employeeView.newEmployee.employeedEnd}" 
      id="emEmployeedEnd" pattern="dd.MM.yyy" showOn="button" /> 

     <h:outputText value="#{msg.active}" /> 
     <p:selectBooleanCheckbox value="#{employeeView.newEmployee.active}" 
      id="emActive" /> 
    </h:panelGrid> 

</h:panelGrid> 

<h:panelGrid columns="3" class="buttonContent" id="button"> 
    <p:commandButton value="#{msg.save}" id="saveButton" update="growl" 
     oncomplete="if ((!args.validationFailed)) dlgEmployeeEdit.hide()" 
     actionListener="#{employeeView.saveOrUpdateEmployee}" /> 
    <p:commandButton value="#{msg.cancel}" immediate="true" 
     oncomplete="dlgEmployeeEdit.hide()"/> 
    <p:commandButton value="#{msg.delete}" immediate="true" 
     oncomplete="dlgEmployeeDelete.show()" 
     disabled="#{(employeeView.newEmployee.id == null) ? true : false}" /> 
</h:panelGrid> 

<p:defaultCommand target="saveButton" /></h:form></html> 

Y ahora aquí son los dos métodos que utilizan en la página:

/** 
* Methode zum Speichern und Updaten eines Mitarbeiters 
*/ 
public void saveOrUpdateEmployee() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    try { 
     logger.debug("save aufgerufen " + this.newEmployee); 
     if (this.selectedDepartment.getId() == null) { 
      this.newEmployee.setDepartment(null); 
     } 
     else { 
      this.newEmployee.setDepartment(this.departmentHandler.getDepartmentById(this.selectedDepartment.getId())); 
     } 
     if (this.selectedPosition.getId() == null) { 
      this.newEmployee.setPosition(null); 
     } 
     else { 
      this.newEmployee.setPosition(this.positionHandler.getPositionById(this.selectedPosition.getId())); 
     } 
     this.employeeController.saveOrUpdate(this.newEmployee); 
     logger.info("Mitarbeiter erfolgreich gespeichert"); 
     context.addMessage(null, new FacesMessage("Successful", "Mitarbeiter gespeichert ")); 
    } 
    catch (Exception e) { 
     logger.error("Fehler beim Speichern des Mitarbeiters", e); 
     context.addMessage(null, new FacesMessage("Fehler beim Speichern des Mitarbeiters", e.getMessage())); 
    } 
    this.loadPersons(); 
} 

/** 
* Methode zum Abbrechen bei der Neuanlage/Änderung eines Mitarbeiters 
* Felder leeren 
*/ 
public void cancel() { 
    logger.debug("cancel()"); 
    this.newEmployee = new Employee(); 
    this.selected = new Employee(); 
    this.selectedDepartment = new Department(); 
    this.selectedPosition = new Position(); 
} 

Si ahora, la validación fallado, el diálogo no se ocultará. Esto está bien y deseado. Muestra mi mensaje creado a través de FacesMassages según sea necesario. Si cierro el cuadro de diálogo por mi cuenta con el botón "cancelar" -Botón, el diálogo se cerrará como se esperaba. En el método cancel(), el objeto Employee se establecerá en una nueva instancia de Employee (this.newEmployee = new Employee()) como puede ver. Pero cuando abro el diálogo después de la falla de validación, el objeto "nuevoEmpleado" contiene solo los valores anteriores ... ¿Por qué mi método cancelar() no funciona? No entiendo.

+0

¡Hola BalusC! ¡Tengo que corregir mi respuesta! ¡Funciona! ¡Acabo de olvidar registrar el ResetInputAjaxActionListener como oyente de fase! ¡Gracias por tu ayuda y respuesta rápida! Su solución – Sandy

Respuesta

3

Este problema está relacionado con JSF issue 1060 y en detalle elaborado en este Q & A: How can I populate a text field using PrimeFaces AJAX after validation errors occur?

al punto, este comportamiento es (por desgracia) correcta según la especificación JSF actual y esto puede ser resuelto de la siguiente manera: durante la fase de invocar acción que necesita para recopilar UIInput componentes que están incluidos en el renderizado ajax, pero no en la ejecución de ajax, y luego invocar el método resetValue() en ellos. Esto puede hacerse de forma genérica y reutilizable con la ayuda de OmniFaces ResetInputAjaxActionListener.

+0

me han ayudado, pero no funciona all.Open el cuadro de diálogo pulsando el botón de esta manera: \t \t \t \t \t \t \t \t Con DBLCLICK en DataTable que pueda cargar y editar los empleados existentes: Por dblclick después de valParificar los campos no se borrará – Sandy

Cuestiones relacionadas