Ajax 如何保存2个相关的SelectOne菜单值
我在这里遇到了一个关于jsf相关下拉选择的小问题。 我有两个下拉选择:第一个是独立的,第二个显示结果,这取决于代码:Ajax 如何保存2个相关的SelectOne菜单值,ajax,jsf,jsf-2,Ajax,Jsf,Jsf 2,我在这里遇到了一个关于jsf相关下拉选择的小问题。 我有两个下拉选择:第一个是独立的,第二个显示结果,这取决于代码: <h:panelGroup id="addressPanel"> <h:outputLabel styleClass="label" value="Provincia: " /> <h:selectOneMenu onchange="updateCombos()" value="
<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}
只在indirizzoCtrl.codiceProvincia=空
。。。在更新模型阶段之前,这是错误的。
因此,第一次调用列表的getter时无法检索任何值,这将导致更新模型阶段失败。
我如何处理这种情况。。。我认为这是一个非常常见的问题,所以我在这里遗漏了一些东西…将bean放在视图范围中。只要您通过ajax与同一视图交互,它就会一直存在。请求范围的bean确实会在每个请求(也是ajax请求)上重新创建,因此bean属性将重新初始化为其默认值
@ManagedBean
@ViewScoped
public class IndidizzoCtrl implements Serializable {
// ...
}
另见:
与具体问题无关,我还强烈建议将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>
另见:
public void updateMenu2() {
menu2items = loadItBasedOn(menu1item);
}