PrimeFaces selectOneMenu设置dynamic="true"未实现懒加载求助
问题分析
你设置了dynamic="true"但页面加载时仍会加载全部公司列表,核心原因是<f:selectItems>直接绑定了loadAllCompaniesList()方法——JSF在页面渲染阶段会自动执行这个方法生成选项,完全绕过了dynamic属性的懒加载逻辑。
解决方案
要实现真正的懒加载,需要将列表改为Bean属性,并在下拉框打开时通过AJAX触发数据加载:
1. 修改Bean代码
将方法调用改为属性+加载方法,初始时列表为空:
private List<CompanyEntity> companiesList; // 提供getter供页面调用 public List<CompanyEntity> getCompaniesList() { return companiesList; } // 下拉框打开时触发的加载方法 public void loadCompaniesList() { this.companiesList = companyDAO.selectAllCompanies(); }
2. 修改XHTML代码
将<f:selectItems>绑定到Bean属性,添加open事件的AJAX监听,触发加载并更新组件:
<p:selectOneMenu id="companyEntity" value="#{docBean.docIncomingEntity.companyEntity}" effect="fade" style="width: 100%" dynamic="true" filter="true" converter="omnifaces.SelectItemsConverter"> <f:selectItems value="#{companyBean.companiesList}" itemLabel="#{item.name}" itemValue="#{item}" var="item"/> <!-- 下拉框打开时触发加载并更新自身 --> <p:ajax event="open" listener="#{companyBean.loadCompaniesList}" update="@this" /> </p:selectOneMenu>
效果说明
页面加载时,companiesList为空,不会执行DAO查询;当用户点击下拉框时,open事件触发AJAX请求,调用loadCompaniesList()加载数据,随后组件更新并渲染选项列表,实现仅在打开时加载数据的需求。
内容的提问来源于stack exchange,提问作者Pegus
相关产品推荐
相关产品推荐

