如何保存2个相关的selectOneMenu值

时间:2011-12-16 16:55:55

标签: ajax jsf jsf-2

我在这里遇到一个关于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时无法检索任何值,这会使更新模型阶段失败。 我怎么能处理这种情况......我认为这是一个很常见的情况,所以我在这里遗漏了一些东西......

1 个答案:

答案 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);
}

另见: