Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 如何保存2个相关的SelectOne菜单值_Ajax_Jsf_Jsf 2 - Fatal编程技术网

Ajax 如何保存2个相关的SelectOne菜单值

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="

我在这里遇到了一个关于jsf相关下拉选择的小问题。 我有两个下拉选择:第一个是独立的,第二个显示结果,这取决于代码:

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