1

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

我需要有 2 个下拉框(A 和 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 随机将其选择更新为默认值,反之亦然!

请指教。

4

1 回答 1

1

这是无效的语法。您需要了解 JSF 生成 HTML 代码。A<h:selectOneMenu>生成一个<select><option/></select>. 您尝试中的嵌套<h:selectOneMenu>将生成<select><option/><select><option/></select></select>完全无效的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>

也可以看看:

于 2013-01-29T14:10:27.727 回答