【发布时间】:2017-02-11 05:30:53
【问题描述】:
我正在尝试在一个列标题中过滤带有 Primefaces 组件 p:selectCheckboxMenu 的 p:dataTable。然而,这并没有按预期工作。数据表上的其他过滤器工作得很好,例如输入字段。
有问题的列是Room type,它有p:selectCheckboxMenu。
过滤工作一次,之后选中或取消选中 selectCheckbox 菜单上的复选框不会添加或删除表格上的任何过滤。
关于这个问题有一个有趣的地方:
如果我从datatable 中删除selectionMode="single" 属性,那么即使在第一个复选框切换之后,排序也会起作用。如,我可以切换和取消切换一个框,p:dataTable 会被相应地过滤。但是,我在这里需要选择模式,因为我应该能够选择一行并通过单击它导航到另一个视图。当datatable 上没有selectionMode 属性时,这不起作用。
这是我的数据表:
<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>
【问题讨论】:
-
您是否尝试过 删除 p:ajax 嵌套在 p:selectCheckboxmenu 中?我认为 filter() 函数本身会触发 ajax 请求。另外,尝试添加 p:ajax event=filter 嵌套在数据表中(例如,在 p:ajax 下方用于 rowSelect)
标签: jsf primefaces datatable filtering