2012-08-02 5 views
5

Ich habe einen Oberflächendialog, in dem ich einen Mitarbeiter erstellen oder aktualisieren kann. Es wird von diesemKein Update von Feldern nach Validierungsfehler

</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> 

öffnet Und hier ist der Dialog Seite

<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> 

und sind nun hier die beiden Methoden, die in der Seite verwendet:

/** 
* 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(); 
} 

Wenn jetzt, Validierung fehlgeschlagen, der Dialog wird nicht ausgeblendet. Das ist OK und gewünscht. Es zeigt meine erstellte Nachricht über FacesMassages wie benötigt. Wenn ich dann die Dialogbox selbst mit dem "Abbrechen" -Button schließe, wird der Dialog wie erwartet geschlossen. In der cancel() - Methode wird das Objekt Mitarbeiter auf eine neue Instanz von Mitarbeiter (this.newEmployee = new Employee()) gesetzt, wie Sie sehen können. Aber wenn ich den Dialog nach dem Fehlschlagen der Validierung öffne, enthält das Objekt "newEmployee" nur die alten Werte ... Warum funktioniert meine Methode cancel() nicht? Ich verstehe nicht.

+0

Hey BalusC! Ich muss meine Antwort korrigieren! Es funktioniert! Ich habe nur vergessen, den ResetInputAjaxActionListener als Phasen-Listener zu registrieren! Danke für Ihre Hilfe und schnelle Antwort! – Sandy

Antwort

3

Dieses Problem zu JSF issue 1060 und im Detail in Beziehung steht in diesem Q & A erarbeitet: How can I populate a text field using PrimeFaces AJAX after validation errors occur?

Auf den Punkt gebracht, ist dieses Verhalten (leider) korrekt gemäß aktuellen JSF-Spezifikation und dies kann wie folgt gelöst werden: während die Aufruf Aktionsphase müssen Sie sammeln UIInput Komponenten, die in der Ajax-Render enthalten sind, aber nicht in der Ajax ausführen, und rufen Sie dann resetValue() Methode für sie auf. Dies kann in generischer und wiederverwendbarer Weise mit Hilfe von OmniFaces ResetInputAjaxActionListener erfolgen.

+0

Ihre Lösung hat mir geholfen, aber es funktioniert nicht all.Open durch Drücken der Taste wie dies den Dialog funktioniert: \t \t \t \t \t \t \t \t Mit DBLCLICK in Datatable kann ich laden und bearbeiten bestehende Mitarbeiter: Durch dblclick nach valFailed Felder werden nicht gelöscht – Sandy

Verwandte Themen