PrimeFaces树形组件中p:ajax的oncomplete自动触发问题咨询
解决PrimeFaces Tree展开时自动触发oncomplete的问题
看起来你遇到的问题是:当使用动态加载(dynamic="true")的PrimeFaces Tree时,绑定在expand事件上的<p:ajax>的oncomplete方法每次展开节点都会自动执行,而你希望控制它的执行时机对吧?
这里有几个可行的解决方案,根据你的具体需求来选:
方案1:仅在首次展开节点时执行oncomplete代码
如果你的需求是每个节点只在第一次被展开时执行initPosition(),后续展开不再触发,可以通过后端Bean记录节点的展开状态,再传递给前端判断:
第一步:在Bean中添加状态记录逻辑
import org.primefaces.event.NodeExpandEvent; import org.primefaces.context.RequestContext; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import java.util.HashMap; import java.util.Map; @ManagedBean @ViewScoped public class Bean { // 记录已展开的节点(假设节点数据有唯一标识) private Map<String, Boolean> expandedNodes = new HashMap<>(); public void onNodeExpand(NodeExpandEvent event) { TreeNode node = event.getTreeNode(); // 用节点的唯一标识作为key,比如node的name或者自定义ID String nodeId = node.getName(); boolean isFirstExpand = !expandedNodes.containsKey(nodeId); if (isFirstExpand) { expandedNodes.put(nodeId, true); } // 把判断结果传递给前端 RequestContext.getCurrentInstance().addCallbackParam("isFirstExpand", isFirstExpand); } // 你的其他Bean代码(比如root节点的getter等) }
第二步:修改前端的ajax代码
<p:tree value="#{Bean.root}" var="node" dynamic="true"> <p:ajax event="expand" listener="#{Bean.onNodeExpand}" oncomplete="if (args.isFirstExpand) { PF('primefacesPersoDialog').initPosition(); }" /> <p:treeNode> <p:outputPanel rendered="#{something}"> <div style="styling"> <h:outputText style="styling" value="#{node.name}" /> <!-- 其他内容 --> </div> </p:outputPanel> </p:treeNode> </p:tree>
方案2:仅在特定节点展开时执行
如果你只想针对某个特定节点(比如根节点或某个特定层级的节点)执行oncomplete代码,可以直接在前端判断节点属性:
<p:tree value="#{Bean.root}" var="node" dynamic="true"> <p:ajax event="expand" oncomplete="if ('#{node.name}' === '目标节点名称') { PF('primefacesPersoDialog').initPosition(); }" /> <!-- 节点内容 --> </p:treeNode> </p:tree>
方案3:仅当对话框可见时执行
如果你的对话框并不是一直显示,只有在它可见的时候才需要调整位置,可以判断对话框的可见状态:
<p:tree value="#{Bean.root}" var="node" dynamic="true"> <p:ajax event="expand" oncomplete="if (PF('primefacesPersoDialog').isVisible()) { PF('primefacesPersoDialog').initPosition(); }" /> <!-- 节点内容 --> </p:treeNode> </p:tree>
方案4:完全移除oncomplete(如果不需要的话)
如果根本不需要在展开节点时执行这个方法,直接删掉oncomplete属性即可:
<p:ajax event="expand" />
内容的提问来源于stack exchange,提问作者Omar Khbou
相关产品推荐
相关产品推荐

