如何在h:selectOneMenu中获取用户选中项并调用视图Bean方法?
需求实现方案
这个需求完全可以实现,现有代码已经具备核心基础,按以下步骤调整即可:
1. 选中值获取逻辑
你现有代码已经将h:selectOneMenu的value属性绑定到#{pessoaView.registro},只要pessoaView中registro属性的类型和dependente实体类型一致,用户选中的条目会直接自动赋值到registro属性,不需要额外开发取值逻辑。
2. Hibernate初始化实现
有两种常用方案可以触发你已开发的初始化方法:
方案一:在setter方法中直接调用
给registro属性的setter方法增加初始化逻辑,赋值时自动执行:
// 示例对应Pessoa实体的set方法 public void setRegistro(Pessoa registro) { this.registro = registro; if (registro != null) { // 直接调用你已开发完成的初始化方法即可 yourInitMethod(registro); } }
方案二:使用值变化监听器
给h:selectOneMenu增加valueChangeListener属性,绑定视图Bean中的处理方法,选中值变化时自动触发:
页面代码调整:
<h:selectOneMenu id="dependenteSalvar" value="#{pessoaView.registro}" styleClass="form-control" converter="indexConverter" valueChangeListener="#{pessoaView.onDependenteSelect}"> <f:selectItem itemValue="#{null}" itemLabel="Selecione..."/> <t:selectItems value="#{pessoaView.pessoasAtivas}" var="dependente" itemLabel="#{dependente.nome} (#{dependente.documento})" itemValue="#{dependente}"/> <!-- 如需选中后实时触发执行,增加ajax标签即可,render属性填需要同步更新的组件id --> <!-- <f:ajax execute="@this" render="targetComponentId"/> --> </h:selectOneMenu>
视图Bean对应方法:
public void onDependenteSelect(ValueChangeEvent event) { Pessoa selectedDependente = (Pessoa) event.getNewValue(); if (selectedDependente != null) { // 调用你已开发完成的初始化方法 yourInitMethod(selectedDependente); } }
注意事项
你当前使用的indexConverter需要确保能正确从pessoasAtivas列表中匹配到对应的实体对象,避免返回游离态的Hibernate代理对象导致初始化报错。如果现有转换器不符合要求,可以替换为按主键查询的实体转换器,拿到持久化对象后再执行初始化操作即可。
内容的提问来源于stack exchange,提问作者Vitor
相关产品推荐
相关产品推荐

