如何动态修改PrimeFaces中<p:ajax>的update属性?
动态修改PrimeFaces <p:ajax>的update属性解决方案
场景与问题
现有带关闭事件监听的对话框代码:
<p:dialog modal="true"> <p:ajax event="close" update="COMPONENT IDs" listener="#{bean.onClose()}" /> </p:dialog>
需要在打开对话框时修改<p:ajax>的update属性,此前尝试的两种方法存在局限:
- 用EL表达式绑定
update值:仅首次渲染时生效,后续更新Bean中的值不会同步到组件 - 服务器端调用
PrimeFaces.current().ajax().update():能更新组件,但不支持PrimeFaces选择器(PFS),比如@(.mystyle)这类依赖客户端jQuery选择的语法
可行解决方案
方案1:EL绑定+重新渲染对话框
如果想用EL动态绑定update值,关键是在修改Bean中的目标值后,重新渲染包含<p:ajax>的对话框组件,让EL重新计算:
- 给对话框添加ID,并将
update绑定到Bean属性:
<p:dialog id="targetDialog" modal="true"> <p:ajax event="close" update="#{bean.dynamicUpdateTargets}" listener="#{bean.onClose()}" /> </p:dialog>
- 在打开对话框的Bean方法中,更新目标值并重新渲染对话框:
public void openDialog() { // 设置新的更新目标,支持PFS选择器 this.dynamicUpdateTargets = "@(.mystyle) form:userTable"; // 重新渲染对话框,让<p:ajax>读取最新的EL值 PrimeFaces.current().ajax().update("targetDialog"); // 打开对话框(如果是代码触发打开) // this.dialogVisible = true; }
每次打开对话框时,对话框组件被重新渲染,<p:ajax>的update属性会加载最新的Bean值,自然支持PFS语法。
方案2:客户端直接修改Ajax配置
利用PrimeFaces客户端API,在打开对话框时直接修改<p:ajax>的配置,无需服务器回发:
- 给对话框和
<p:ajax>添加标识:
<p:dialog widgetVar="dialogWidget" modal="true"> <p:ajax id="closeAjax" event="close" update="INITIAL_IDS" listener="#{bean.onClose()}" /> </p:dialog>
- 编写客户端打开对话框的方法,修改Ajax配置:
function openDialog() { // 获取<p:ajax>对应的DOM元素 var ajaxEl = PF('dialogWidget').jq.find('#closeAjax').get(0); // 修改update属性,支持PFS选择器 ajaxEl.cfg.update = '@(.mystyle) form:profilePanel'; // 打开对话框 PF('dialogWidget').show(); }
这种方式直接在客户端调整Ajax的更新目标,适合纯前端动态控制的场景。
方案3:服务器端手动解析PFS选择器
如果必须在服务器端监听器中处理更新,可以手动解析PFS选择器对应的组件ID,再执行更新:
public void onClose() { FacesContext context = FacesContext.getCurrentInstance(); // 解析PFS选择器,获取对应的客户端ID列表 ValueExpression ve = context.getApplication().getExpressionFactory() .createValueExpression(context.getELContext(), "@(.mystyle)", List.class); List<String> targetIds = (List<String>) ve.getValue(context.getELContext()); // 执行更新 PrimeFaces.current().ajax().update(targetIds.toArray(new String[0])); }
注意:这种方式需要确保选择器能正确解析到目标组件,适合服务器端逻辑决定更新目标的场景。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

