我正在使用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随机地将其选择更新为默认值反之亦然!
请告知。
答案 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>