PrimeFaces 12.0.0 DataTable使用disabledSelection时选择功能异常求助
PrimeFaces 12.0.0 DataTable disabledSelection 属性问题分析与解决
问题确认
你遇到的这些问题并非配置遗漏,而是PrimeFaces 12.0.0版本在disabledSelection结合selectionPageOnly=false时的已知bug,具体对应:
- 客户端无区分可选/不可选行的CSS类:12.0.2版本的发布说明已标注此问题已修复
- 表头全选复选框选中所有行:触发提交时浏览器发送
myForm:myTable_selection:@all参数,服务器会将所有列表项纳入选中集合,但客户端仅勾选可选行,导致前后端状态不一致 - 设置
selectionMode=multiple到DataTable上时功能完全失效:所有复选框被禁用且无控制台报错,仅省略该属性时功能可用,但需手动在服务器端过滤选中行
代码示例
你的实现代码如下(未配置行选择Ajax事件):
<h:form id="tblForm"> <p:dataTable id="myTable" widgetVar="myTableWv" value="#{myBean.list}" var="item" size="small" sortBy="#{myBean.defaultSort}" filterBy="#{myBean.defaultFilter}" selection="#{myBean.listOfSelected}" selectionPageOnly="false" rowKey="#{item.id}" disabledSelection="#{myBean.shouldDisable(item)}"> <p:column selectionMode="multiple" /> <p:column> <f:facet name="header"> <p:commandButton process="@this myTable" action="#{myBean.doSomethingWithSelectedItems}" /> </f:facet> </p:column> </p:dataTable> </h:form>
解决方案
- 版本升级:优先升级到PrimeFaces 12.0.2及以上版本,可直接修复CSS类缺失的问题,同时对全选逻辑、selectionMode配置问题也有优化
- 服务器端临时过滤:若无法升级版本,在处理选中项的方法中手动过滤不可选条目:
public void doSomethingWithSelectedItems() { // 移除所有不可选的条目 listOfSelected.removeIf(item -> shouldDisable(item)); // 执行后续业务逻辑 }
- 调整selectionMode配置:仅在
<p:column>标签上设置selectionMode="multiple",不要在<p:dataTable>上配置该属性,避免功能失效
内容的提问来源于stack exchange,提问作者Nikola
相关产品推荐
相关产品推荐

