PrimeFaces p:dataTable过滤后如何自动展开指定目标行
实现PrimeFaces p:dataTable 筛选后自动展开指定行的方案
下面提供两种常用实现方式,可根据你的业务场景选择:
方案1:后端绑定展开状态(推荐,适配服务端筛选场景)
通过原生属性绑定展开状态,无需额外写JS逻辑,适配Ajax异步筛选的场景。
- 先给外层父级
p:dataTable添加expandedRowKeys和rowKey属性:
<!-- 外层父表配置 --> <p:dataTable id="parentTable" var="inventoryPart" value="#{partnerInventory.inventoryPartList}" rowKey="#{inventoryPart.id}" expandedRowKeys="#{partnerInventory.expandedRowKeys}"> <p:rowExpansion> <p:dataTable var="inventoryPartsItems" value="#{partnerInventory.getInventoryItems(inventoryPart)}" emptyMessage="#{msgs.common_no_registries}" id="tableItems"> <p:column style="width:16px"> <p:rowToggler rendered="#{inventoryPartsItems.sapOperation != null}" /> </p:column> <!-- 子表其余列配置 --> </p:dataTable> </p:rowExpansion> <!-- 父表其余列配置 --> </p:dataTable>
- 后端对应Bean添加属性和逻辑,筛选完成后把需要展开的行的唯一标识存入集合即可:
// 后端Bean中定义存储展开行key的集合 private Set<Object> expandedRowKeys = new HashSet<>(); // 筛选器对应的查询方法 public void doFilterQuery() { // 执行你的筛选逻辑,拿到全量列表 inventoryPartList = inventoryService.queryByFilter(filterParams); // 清空历史展开状态 expandedRowKeys.clear(); // 遍历列表,把符合自动展开条件的行的唯一标识(和rowKey对应)存入集合 for (InventoryPart part : inventoryPartList) { // 这里替换为你自己的判断逻辑,比如匹配筛选条件的行自动展开 if (isMatchExpandCondition(part)) { expandedRowKeys.add(part.getId()); } } } // 补充getter/setter public Set<Object> getExpandedRowKeys() { return expandedRowKeys; } public void setExpandedRowKeys(Set<Object> expandedRowKeys) { this.expandedRowKeys = expandedRowKeys; }
注意:
rowKey属性的值要和你存入expandedRowKeys的内容对应,如果你用其它字段作为行唯一标识,直接修改rowKey配置即可,比如rowKey="#{inventoryPart.partCode}"。
方案2:前端JS手动触发(适配前端本地筛选场景)
如果你的筛选是纯前端本地处理,可通过PrimeFaces客户端API手动触发行展开:
- 给外层父表添加
widgetVar属性,方便获取客户端实例:
<p:dataTable id="parentTable" var="inventoryPart" value="#{partnerInventory.inventoryPartList}" widgetVar="parentTableWgt"> <!-- 其余配置不变 --> </p:dataTable>
- 筛选完成后调用JS方法触发指定行展开:
function autoExpandTargetRow() { // 获取表格客户端实例 const table = PF('parentTableWgt'); // 替换为你需要展开的行的索引,也可以遍历行数据匹配条件拿到对应索引 const targetRowIndex = 0; // 触发展开 table.toggleExpansion(targetRowIndex); }
内容的提问来源于stack exchange,提问作者Fabricio Santi
相关产品推荐
相关产品推荐

