2012-08-02 7 views
5

後、私は従業員を作成または更新が可能なprimefacesダイアログを持つフィールドのアップデートがありません。 それはこの検証エラー

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

そして今、ここでは、ページで使用される2つの方法ですされています

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

今ならば、検証失敗した場合、ダイアログは非表示になりません。これは問題なくOKです。必要に応じてFacesMassagesを介して作成したメッセージを表示します。私は "キャンセル"ボタンで自分でダイアログボックスを閉じると、ダイアログが期待どおりに閉じます。 cancel() - メソッドでは、オブジェクトEmployeeはEmployee(this.newEmployee = new Employee())の新しいインスタンスに設定されます。しかし、検証の失敗後にダイアログを開くと、オブジェクト "newEmployee"には古い値だけが含まれています...なぜ、私のメソッドcancel()が機能しないのですか?わかりません。

+0

ねえBalusC!私は私の答えを修正する必要があります!それは働く!私はちょうど位相リスナーとしてResetInputAjaxActionListenerを登録するのを忘れている!あなたの助けと高速な答えをありがとう! – Sandy

答えて

3

この問題はJSF issue 1060に関連し、詳細には、このQで& A詳述される:点にHow can I populate a text field using PrimeFaces AJAX after validation errors occur?

を、この動作は、(残念ながら)正しい現在のJSF仕様に従って、であり、これは以下のように解くことができる:時呼び出しアクションフェーズは、あなたは、Ajaxレンダリングに含まれているUIInputコンポーネントを収集する必要はなく、AJAXで実行し、それらの上にresetValue()メソッドを呼び出します。これは汎用的で再利用可能な方法で、OmniFaces ResetInputAjaxActionListenerの助けを借りて行うことができます。

+0

あなたのソリューションは、私を助けてきたが、それは、ダイアログのようにボタンを押すことでall.Openを動作しません。 \t \t \t \t \t \t \t \t データテーブルで私ができ負荷と既存の従業員を編集: DBLCLICKことでvalFailedフィールドはクリアされません後 – Sandy