Primefaces 14.0.10:不可见标签页中p:ajax标签失效问题求助
解决PrimeFaces 14.0.10中TabView不可见DataTable的过滤递归循环问题
方案1:动态控制DataTable的autoUpdate属性
针对初始不可见的DataTable,结合TabView的激活状态动态设置autoUpdate属性,仅在标签页可见时启用自动更新:
<p:tabView id="tabView" widgetVar="tabWidget"> <p:tab title="可见标签页"> <p:dataTable id="table1" ...> <p:ajax event="filter" ignoreAutoUpdate="true"/> <!-- 列定义 --> </p:dataTable> </p:tab> <p:tab title="初始不可见标签页"> <p:dataTable id="table2" ... autoUpdate="#{tabWidget.activeIndex eq 1}"> <p:ajax event="filter" ignoreAutoUpdate="true"/> <!-- 列定义 --> </p:dataTable> </p:tab> </p:tabView>
原理:当标签页不可见时,autoUpdate设为false,DataTable不会被自动更新,从根源避免触发过滤事件。
方案2:缩小局部更新的目标范围
如果之前的局部更新范围过大,改为仅更新当前激活的标签页内容:
<!-- 触发局部更新的组件示例 --> <p:commandButton ... update="#{tabWidget.activeTab.clientId}"/>
这样只会更新可见标签页内的DataTable,不会触碰到不可见的表格,自然不会触发其过滤事件。
方案3:在过滤方法中添加可见性判断
若不想改动页面代码,可在Bean的过滤方法中加入判断,仅当表格所在标签页可见时才执行逻辑:
import org.primefaces.component.tabview.TabView; import javax.faces.context.FacesContext; public void filterTable2() { TabView tabView = (TabView) FacesContext.getCurrentInstance().getViewRoot().findComponent("form:tabView"); // 第二个标签页索引为1(索引从0开始) if (!tabView.isTabActive(1)) { return; } // 原有过滤逻辑 }
即使过滤事件被意外触发,也会直接跳过执行,避免递归循环。
备选方案:临时降级或等待官方修复
如果以上方案都不符合需求,可临时降级到PrimeFaces 14.0.9(该版本无此问题),同时关注官方issue追踪,等待修复版本发布。
内容的提问来源于stack exchange,提问作者Francis Moerman
相关产品推荐
相关产品推荐

