Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PrimeFaces,数据表过滤问题+;Ajax表更新_Java_Jsf_Primefaces_Datatable_Filtering - Fatal编程技术网

Java PrimeFaces,数据表过滤问题+;Ajax表更新

Java PrimeFaces,数据表过滤问题+;Ajax表更新,java,jsf,primefaces,datatable,filtering,Java,Jsf,Primefaces,Datatable,Filtering,我使用的是PF 3.5社区版,我有以下问题 我构建了一个Datatable,它对一列和可选行以及上下文菜单使用过滤器 当我使用AJAX插入新条目(通过对话框)并更新datatable时,这似乎会产生某种冲突。第一次插入总是有效的,但随后的插入似乎从未调用动作侦听器。我使用courseTable.filter();这一问题仍然存在。我也尝试过在带有过滤器和不可选择行的数据表上,以及在没有过滤器和可选择行的数据表上做同样的操作。两种情况都可以,但是组合存在问题 <h:form id="main

我使用的是PF 3.5社区版,我有以下问题

我构建了一个Datatable,它对一列和可选行以及上下文菜单使用过滤器

当我使用AJAX插入新条目(通过对话框)并更新datatable时,这似乎会产生某种冲突。第一次插入总是有效的,但随后的插入似乎从未调用动作侦听器。我使用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>

更详细地说:

  • 在数据表中添加之后,如果没有应用过滤器,现在可以正常添加课程
  • 我没有使用courseTable.filter();在“提交”对话框中。如果我使用它,即使我没有应用过滤器,我也不能添加课程
  • Delete似乎可以完美地处理我尝试的任何设置(应用过滤器和非应用过滤器)
  • 找到解决方案

    似乎在后台bean中使用一个不同的对象来存储数据表选择,而在“插入课程对话框”中使用另一个对象解决了这个问题

    在我的例子中,我在这两种语言中都使用了
    #{course.course}
    。现在我添加了一个
    {course.selectedCourse}
    来处理数据表

    当然,应该相应地更新支持bean