如何在点击PrimeFaces inplace组件时加载selectCheckboxMenu选项?
p:selectCheckboxMenu的dynamic属性是用来延迟渲染下拉面板的,并非控制选项数据的加载时机,所以直接使用它无法实现点击inplace时加载选项的需求。要达成目标,需要结合AJAX事件触发后台数据加载,再更新对应组件。
解决方案步骤:
- 给
p:inplace添加activate事件的AJAX监听,触发后台加载选项数据 - 后台用实例变量存储加载后的选项,避免页面初始化时就执行计算逻辑
- 更新
selectCheckboxMenu以渲染新加载的选项
修改后的前端代码:
<p:inplace label="Values" effectSpeed="fast" id="inplaceValues"> <!-- 点击激活inplace时触发后台加载,并更新多选菜单 --> <p:ajax event="activate" listener="#{segmentParamsView.loadValues(referential)}" update="checkboxMenu" /> <p:selectCheckboxMenu id="checkboxMenu" multiple="true" updateLabel="true" value="#{referential.values}" label="Values"> <f:selectItems value="#{segmentParamsView.loadedValues}" var="value" itemLabel="#{value}" itemValue="#{value}"/> </p:selectCheckboxMenu> </p:inplace>
后台Bean调整(以SegmentParamsView为例):
import javax.faces.view.ViewScoped; import javax.inject.Named; import java.io.Serializable; import java.util.List; @Named @ViewScoped public class SegmentParamsView implements Serializable { private List<String> loadedValues; // 存储动态加载的选项 // 激活inplace时调用,加载对应referential的选项 public void loadValues(Referential referential) { this.loadedValues = calculateValues(referential); // 复用原有的计算逻辑 } // 原有的选项计算方法,保持逻辑不变 public List<String> calculateValues(Referential referential) { // 这里是你的选项生成逻辑,比如数据库查询、业务计算等 return ...; } // getter方法供页面调用 public List<String> getLoadedValues() { return loadedValues; } }
关键说明:
p:ajax event="activate":在用户点击inplace进入编辑状态时触发后台方法update="checkboxMenu":触发AJAX后更新多选菜单组件,让新加载的选项显示出来- 后台用
loadedValues变量存储数据:确保只有点击inplace时才执行calculateValues,避免页面初始化时就加载不必要的数据
内容的提问来源于stack exchange,提问作者Mortadha BOUALLAGUI
相关产品推荐
相关产品推荐

