关于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>
Run Code Online (Sandbox Code Playgroud)
好吧,当用户在选择了两个值后保存表单时,托管bean indirizzoCtrl(请求作用域)无法将第二个下拉列表的值映射回列表,因为没有列表.事实上,#{indirizzoCtrl.allComuni}只有在indirizzoCtrl.codiceProvincia!=null...更新模型阶段之前,才调用从数据库检索数据的getter .因此,第一次调用列表的getter时无法检索任何值,这会使更新模型阶段失败.我怎么能处理这个场景......我认为这是一个很常见的场景,所以我在这里遗漏了一些东西......
将bean放在视图范围中.只要您通过ajax与同一视图进行交互,它就会存在.确实在每个请求上重新创建了一个请求范围的bean,也就是ajax请求,因此bean属性会重新初始化为它们的默认值.
@ManagedBean
@ViewScoped
public class IndidizzoCtrl implements Serializable {
// ...
}
Run Code Online (Sandbox Code Playgroud)
无关的具体问题,我也强烈建议改变你的getter方法没有做任何业务工作,但只是返回的数据.在(动作)侦听器方法中执行业务工作.例如
<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>
Run Code Online (Sandbox Code Playgroud)
同
public void updateMenu2() {
menu2items = loadItBasedOn(menu1item);
}
Run Code Online (Sandbox Code Playgroud)