嵌套的SelectOneMenu JSF 2.1

时间:2013-01-29 14:04:19

标签: ajax jsf-2 selectonemenu

我正在使用JSf2.1开发一个Web应用程序。 我正在按照教程编写一个selectOneMenu(下拉列表框)。

我需要有2个下拉框(A ad B)但基本上调用相同的ajax监听器函数,该函数将使用选项A和B进行一些计算...

那么,我们可以像这样嵌套selectOneMenu吗?

<h:form id= "ourForm">
    <h:selectOneMenu value= "#{bean.valA}"...>
       <f:selectItems ... />
        <h:selectOneMenu value= "#{bean.valB}"...>
             <f:selectItems ... />
             <f:ajax listener="#{bean.listener}" render="ourForm"/>
        </h:selectOneMenu>
    </h:selectOneMenu>
</h:form>

bean监听器方法:

public void Listener{

//use valA and valB


}

好吧,我尝试了上面的操作,但页面显示了一个警告:

表单组件需要在其祖先中包含一个UIForm。附加必要的内容

我在没有嵌套的情况下尝试通过在每个selectOneMenu上调用相同的监听器但是我得到相同的随机行为..我:当我选择A的elem 1保留B上的“prev”选项时,框B随机地将其选择更新为默认值反之亦然!

请告知。

1 个答案:

答案 0 :(得分:1)

这是无效的语法。您需要了解JSF生成HTML代码。 <h:selectOneMenu>生成<select><option/></select>。在您的尝试中嵌套<h:selectOneMenu>将生成<select><option/><select><option/></select></select>,这完全是invalid HTML(因此本质上也是完全无效的JSF)。

您对具体的功能要求并不十分清楚,但我知道您只想在父菜单的某些选择上显示子菜单吗?在这种情况下,请使用rendered属性并在<f:ajax render>中引用它。

这是一个粗略的启动示例,必要时可以更加简化(例如,不需要renderMenuB属性,具体取决于您没有说明的具体功能要求。)

<h:selectOneMenu value="#{bean.selectedValueA}">
    <f:selectItems value="#{bean.availableValuesA}" />
    <f:ajax listener="#{bean.handleChangeA}" render="menuB" />
</h:selectOneMenu>
<h:panelGroup id="menuB">
    <h:selectOneMenu value="#{bean.selectedValueB}" rendered="#{bean.renderMenuB}">
        <f:selectItems value="#{bean.availableValuesB}" />
        <f:ajax listener="#{bean.handleChangeB}" render="ourForm" />
    </h:selectOneMenu>
</h:panelGroup>

另见: