2012-08-02 12 views
5

Ho una finestra di dialogo Primefaces in cui posso creare o aggiornare un Dipendente. Si aprirà da questoNessun aggiornamento dei campi dopo l'errore di convalida

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

Ed ecco la finestra di dialogo Pagina

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

Ed ora ecco i due metodi che hanno usato nella pagina:

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

Se ora, la convalida fallito, la finestra di dialogo non si nasconde. Questo è OK e desiderato. Mostra il mio messaggio creato tramite FacesMassages come richiesto. Se poi chiudo la finestra di dialogo da solo con il pulsante "Annulla", la finestra di dialogo si chiuderà come previsto. Nel metodo cancel() - l'oggetto Employee sarà impostato su una nuova istanza di Employee (this.newEmployee = new Employee()) come puoi vedere. Ma quando apro la finestra di dialogo dopo l'errore di validazione, l'oggetto "newEmployee" contiene solo i vecchi valori ... Perché il mio metodo cancel() non funziona? Non capisco.

+0

Ehi BalusC! Devo correggere la mia risposta! Funziona! Ho appena dimenticato di registrare ResetInputAjaxActionListener come ascoltatore di fase! Grazie per il vostro aiuto e risposta veloce! – Sandy

risposta

3

Questo problema è legato alla JSF issue 1060 e dettagliatamente elaborati in questo Q & A: How can I populate a text field using PrimeFaces AJAX after validation errors occur?

Al punto, questo comportamento è (purtroppo) corretta secondo la specifica JSF corrente e questo può essere risolto come segue: durante la fase di azione di richiamo è necessaria per raccogliere i componenti UIInput che sono inclusi nel rendering di ajax, ma non nell'esecuzione di ajax e quindi richiamare il metodo resetValue() su di essi. Questo può essere in modo generico e riutilizzabile da fare con l'aiuto di OmniFaces ResetInputAjaxActionListener.

+0

La soluzione mi hanno aiutato, ma non funziona all.Open la finestra premendo il pulsante in questo modo: \t \t \t \t \t \t \t \t Con DoppioClic nel DataTable che posso caricare e modificare i dipendenti esistenti: Da dblclick dopo che i campi valFail non si cancellano – Sandy

Problemi correlati