2013-07-30 18 views
1

我正在使用PF 3.5社區版,我遇到以下問題。PrimeFaces,數據過濾問題+ Ajax表更新

我已經構建了一個Datatable,它爲一列和可選行以及上下文菜單使用過濾器。

當我使用AJAX插入新條目(通過對話框)並更新數據表時,這似乎會產生某種衝突。第一次插入總是有效的,後續的永遠不會調用動作監聽器。我使用courseTable.filter();到處都是,但問題仍然存在。我曾嘗試使用過濾器和非可選行在數據表上執行相同的操作,並且在沒有過濾器和可選行的數據表上執行同樣的操作。兩種情況都可以正常工作,但組合卻存在問題。

<h:form id="mainForm"> 
     <p:focus /> 

     <!-- Main Data-table --> 
     <h:panelGrid style="width:700px;"> 

      <p:dataTable var="c" id="courseTable" widgetVar="courseTable" 
       value="#{course.courseList}" rowKey="#{c.courseId}" 
       selectionMode="single" 
       filteredValue="#{course.filteredCourseList}"> 

       <p:ajax event="filter" global="false" /> 

       <f:facet name="header"> 
        <p:commandButton value="Add Course" process="@this" 
         update="@this :courseForm" oncomplete="dlgInsertCourse.show()"/> 
       </f:facet> 

       <p:column id="courseCode" filterBy="#{c.courseCode}" 
        sortBy="#{c.courseCode}" filterMatchMode="contains" 
        headerText="Course Code"> 
        <h:outputText value="#{c.courseCode}" /> 
       </p:column> 

       <p:column id="courseName" filterBy="#{c.courseName}" 
        sortBy="#{c.courseName}"filterMatchMode="contains" 
        headerText="Course Name"> 
        <h:outputText value="#{c.courseName}" /> 
       </p:column> 

       <p:column id="courseType" filterBy="#{c.courseType}" 
        sortBy="#{c.courseType}" 
        filterOptions="#{course.courseTypeOptions}" 
        headerText="Course Type" filterMatchMode="exact"> 
        <h:outputText value="#{c.courseType}" /> 
       </p:column> 
      </p:dataTable> 

     </h:panelGrid> 

     <!-- Context Menu --> 
     <p:contextMenu for="courseTable"> 

      <p:menuitem value="Edit" icon="ui-icon-pencil" 
       update=":courseForm" 
       oncomplete="dlgInsertCourse.show()"/> 

       <p:menuitem value="Delete" icon="ui-icon-trash" update="@form" 
       oncomplete="courseTable.filter();" /> 
     </p:contextMenu> 
    </h:form> 

    <!-- Insert Course Dialog --> 
    <p:dialog header="Create" widgetVar="dlgInsertCourse" 
     draggable="true" resizable="false"> 
     <h:form id="courseForm"> 
      <p:panelGrid columns="1"> 

       <p:row> 
        <p:panelGrid columns="2"> 

         <p:outputLabel value="Course Code: *"/> 
         <p:inputText label="Course Code" 
          value="#{course.course.courseCode}" /> 

         <p:outputLabel value="Course Name: *" /> 
         <p:inputText label="CourseName" 
          value="#{course.course.courseName}" /> 

         <p:outputLabel value="Course Type: *" /> 
         <p:selectOneRadio label="Course Type" 
          value="#{course.course.courseType}"> 
          <f:selectItem itemLabel="Core" itemValue="Core" /> 
          <f:selectItem itemLabel="Elective" itemValue="Elective" /> 
         </p:selectOneRadio> 

        </p:panelGrid> 
       </p:row> 

      </p:panelGrid> 

      <h:panelGroup style="display:block; text-align:center"> 
       <p:commandButton value="Submit" update="@form :mainForm :messages" 
        process="@form" 
        oncomplete="if (!args.validationFailed) dlgInsertCourse.hide();" 
        actionListener="#{course.saveCourse()}" 
        /> 
      </h:panelGroup> 
     </h:form> 
    </p:dialog> 

更詳細地:

  1. 我在數據表中加完後,現在我可以正常如果我不應用濾波器添加課程
  2. 我還沒有使用courseTable.filter();在提交對話框中。如果我使用它,即使我沒有應用過濾器,我也無法添加課程
  3. 刪除似乎與我嘗試的任何設置(應用過濾器和未應用)完美配合。

回答

0

找到解決方案。

看起來在支持bean中使用不同的對象來存儲數據表選擇,另一個用於「插入課程對話框」解決了這個問題。

在我的情況下,我在兩個中都使用了#{course.course}。現在我添加了#{course.selectedCourse}來處理數據表。

當然,支持bean應該相應地更新。