2012-08-02 3 views
5

У меня есть диалоговое окно, в котором я могу создать или обновить Employee. Он откроется этимНет обновления полей после ошибки проверки

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

А вот диалог

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

А теперь вот два метода, которые используются в Page:

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

Если теперь, проверки не удалось, диалог не скроется. Это нормально и желательно. Он показывает мое созданное сообщение через FacesMassages по мере необходимости. Если я закрою диалоговое окно самостоятельно с помощью кнопки «Отменить», диалог закроется, как ожидалось. В методе cancel() - объект Employee будет установлен на новый экземпляр Employee (this.newEmployee = new Employee()), как вы можете видеть. Но когда я открываю диалог после отказа проверки, объект «newEmployee» содержит только старые значения ... Почему мой метод cancel() не работает? Я не понимаю.

+0

Hey BalusC! Я должен исправить свой ответ! Это работает! Я только что забыл зарегистрировать ResetInputAjaxActionListener как слушателя фазы! Спасибо за вашу помощь и быстрый ответ! – Sandy

ответ

3

Эта проблема связана с JSF issue 1060 и подробно разработаны в этом Q & A: How can I populate a text field using PrimeFaces AJAX after validation errors occur?

К точке, такое поведение (к сожалению) правильно в соответствии с текущей спецификации JSF, и это может быть решена следующим образом: во время на этапе активации вы должны собрать UIInput компонентов, которые включены в рендеринг ajax, но не в выполнении ajax, а затем вызвать метод resetValue(). Это можно сделать общим и повторно использовать с помощью OmniFaces ResetInputAjaxActionListener.

+0

Ваше решение помогло мне, но он не работает all.Open диалог с помощью кнопки, как это: \t \t \t \t <р: CommandButton значение = "# {} msg.employeeAdd" ID = "AddButton" \t \t \t \t \t обновление = ": employeeEditDialog,: showEmployees,: editContent" \t \t \t \t \t OnComplete = "dlgEmployeeEdit.show()"> \t \t \t \t с DblClick в DataTable я могу загрузка и редактирование существующих сотрудников: <р: Ajax события = слушатель = "# {} employeeView.onRowSelect" процесс "rowDblselect" = "@ этом" \t \t \t \t \t обновления = ": employeeEditDialog,: showEmployees,: editContent" oncomplete = "dlgEmployeeEdit.show()" /> По dblclick после valFailed полей не будет очищаться – Sandy

Смежные вопросы