如何用p:selectCheckboxMenu过滤带有selectionMode的p:dataTable?

时间:2016-10-03 09:46:42

标签: jsf primefaces datatable filtering

我正在尝试在一个列标题中使用Primefaces组件p:dataTable过滤p:selectCheckboxMenu。然而,这并不按预期工作。数据表上的其他过滤器工作正常,例如输入字段。 相关列是Room type,其中包含p:selectCheckboxMenu

过滤工作一次,在selectCheckbox菜单上选中或取消选中框后,不会在表格上添加或删除任何过滤。

这是一个有趣的问题:

如果我从selectionMode="single"中删除datatable属性,那么即使在第一个checkBox切换之后,排序也会起作用。在中,我可以切换和解开一个框,p:dataTable会相应地进行过滤。但是,我需要这里的选择模式,因为我应该能够选择一行并通过单击导航到另一个视图。当selectionMode上没有datatable属性时,这不起作用。

这是我的数据表:

<div class="background">

        <div class="freeRoomsContent">

            <br/>
            <p:outputLabel value="free rooms" styleClass="headerfont"/>
            <br/>
    <h:form id="freeRoomsForm">
        <p:dataTable id="freeRoomsTable" var="room" paginatorPosition="bottom" paginatorAlwaysVisible="false"
                     value="#{freeRoomsController.freeRoomsList}" selectionMode="single" selection="#{freeRoomsController.room}"
                     rowKey="#{room.roomId}" widgetVar="freeRoomsTable"
                     paginator="true" rows="20" pageLinks="5" scrollable="false"
                     paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                     rowsPerPageTemplate="20,50,100" skipChildren="true" emptyMessage="No free rooms available.">
            <p:ajax event="rowSelect" listener="#{freeRoomsController.onRowSelect}" />
            <p:column headerText="Room Id" sortBy="#{room.roomId}" filterMatchMode="contains" filterBy="#{room.roomId}">
                <h:outputText value="#{room.roomId}"/>
              </p:column>

            <p:column headerText="Room number" sortBy="#{room.roomNumber}" filterMatchMode="contains" filterBy="#{room.roomNumber}">
                <h:outputText value="#{room.roomNumber}" />
            </p:column>
<!-- other similar columns -->

            <p:column headerText="Room type" filterMatchMode="exact" filterBy="#{room.roomType}">
                <f:facet name="filter">
                    <p:selectCheckboxMenu  onchange="PF('freeRoomsTable').filter()"
                                     label="Room type">
                        <f:selectItems value="#{staticData.roomTypes}" var="rt" itemLabel="#{msg[rt.name]}" itemValue="#{rt.name}"
                                       />
                    <p:ajax event="change" process="@this" update="freeRoomsForm" />
                    <p:ajax event="toggleSelect" process="@this" update="freeRoomsForm" />
                    </p:selectCheckboxMenu>
                </f:facet>
                <h:outputText value="#{msg[room.roomtype.name]}">
                    <f:convertDateTime pattern="dd.MM.yyyy" />
                </h:outputText>
            </p:column>

<!-- normal input field columns that work -->

        </p:dataTable>
    </h:form>
</div>
</div>

1 个答案:

答案 0 :(得分:1)

这对我有用:

  • p:dataTable

    中使用 filteredValue

  • 仅使用onchange=PF('freeRoomsTable').filter()

    中没有子p:ajax元素的p:selectCheckboxMenu value

  • p:selectCheckboxMenu设置value="#{someBean.selectedItems}"属性,例如private String[] selectedItems

  • 在你的bean中,使用public boolean filterFunction(Object value, Object filter, Locale locale) { // instanceof checking probably not needed if (value == null || !(value instanceof String)) { return true; } String valueInRow = (String)value; // if nothing is selected, show row in table i.e. return true, // you can play with this ofcourse if (selectedItems == null || selectedItems.length == 0) { return true; } // if item in row matches any of the items that were selected in header, // show in table i.e. return true for (int i = 0; i < selectedItems.length; i++) { if (selectedItems[i].equals(valueInRow)) { return true; } } // if you don't want to show row in table, return false return false; } ,使用getter和setter

  • 在您的bean工具 filterFunction 中,方法需要为此签名布尔(对象,对象,区域设置)例如,仅使用第一个参数(对象值):

    p:column

  • filterfunction=#{someBean.filterFunction}中,调用\s.+ - 没有参数,没有括号,不需要使用任何 filterMatchMode ,只留下的 filterBy