我正在尝试在一个列标题中使用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>
答案 0 :(得分:1)
这对我有用:
p:dataTable
中使用值和 filteredValue
onchange=PF('freeRoomsTable').filter()
中没有子
p:ajax
元素的p:selectCheckboxMenu
value
p:selectCheckboxMenu
设置value="#{someBean.selectedItems}"
属性,例如private String[] selectedItems
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
p:column
filterfunction=#{someBean.filterFunction}
中,调用\s.+
- 没有参数,没有括号,不需要使用任何 filterMatchMode ,只留下的 filterBy 强>