我在这里遇到一个关于jsf相关下拉选择的小问题。 我有2个下拉选择:第一个是独立的,第二个显示结果取决于这是代码:
<h:panelGroup id="addressPanel">
<h:outputLabel styleClass="label" value="Provincia: " />
<h:selectOneMenu onchange="updateCombos()"
value="#{indirizzoCtrl.codiceProvincia}" >
<f:selectItem itemValue="" itemLabel=""></f:selectItem>
<f:selectItems value="#{indirizzoCtrl.allProvincia}" var="c"
itemLabel="#{c.nome}" itemValue="#{c.siglaProvincia}" />
</h:selectOneMenu>
<h:outputLabel styleClass="label" value="Comune: " />
<h:selectOneMenu
value="#{indirizzoCtrl.codiceComune}" >
<f:selectItem itemValue="" itemLabel=""></f:selectItem>
<f:selectItems value="#{indirizzoCtrl.allComuni}" var="c"
itemLabel="#{c.descrizione}" itemValue="#{c.codiceComune}" />
</h:selectOneMenu>
</h:panelGrid>
</h:panelGroup>
<p:remoteCommand name="updateCombos" update="addressPanel masterForm:msg" />
<p:commandButton styleClass="commandButton" value="Save"
actionListener="#{indirizzoCtrl.save}">
</p:commandButton>
好吧,当用户在选择了两个值后保存表单时,托管bean indirizzoCtrl(请求作用域)无法将第二个下拉列表的值映射回列表,因为没有列表。
实际上#{indirizzoCtrl.allComuni}
调用一个getter,只有在indirizzoCtrl.codiceProvincia!=null
...并且在更新模型阶段之前为false时才从数据库中检索数据。
因此,第一次调用列表的getter时无法检索任何值,这会使更新模型阶段失败。
我怎么能处理这种情况......我认为这是一个很常见的情况,所以我在这里遗漏了一些东西......
答案 0 :(得分:5)
将bean放在视图范围内。只要您通过ajax与同一视图进行交互,它就会存在。确实在每个请求上重新创建了一个请求范围的bean,也就是ajax请求,所以bean属性会重新初始化为它们的默认值。
@ManagedBean
@ViewScoped
public class IndidizzoCtrl implements Serializable {
// ...
}
无关,我还强烈建议将您的getter方法更改为不执行任何业务工作,但只返回数据。在(动作)侦听器方法中执行业务工作。 E.g。
<h:selectOneMenu value="#{bean.menu1item}">
<f:selectItems value="#{bean.menu1items}" />
<f:ajax listener="#{bean.updateMenu2}" render="menu2" />
</h:selectOneMenu>
<h:selectOneMenu id="menu2" value="#{bean.menu2item}">
<f:selectItems value="#{bean.menu2items}" />
</h:selectOneMenu>
与
public void updateMenu2() {
menu2items = loadItBasedOn(menu1item);
}