我有一个列表框,我想抓住选择中的变化,以便根据它填充另一个。我试过以下方式:
<h:selectOneMenu id="comunitaValle" value="#{struttura.nomeComunitaDiValle}"
onchange="submit()" valueChangeListener="#{struttura.getComuniInComunita}">
<f:selectItems value="#{struttura.comunitaValleList}" />
</h:selectOneMenu>
它工作正常,但在此页面中还有其他参数标记为
required="true"
当提交表单时,我收到控制已设置这些字段的错误消息。如何避免提交整个表单以避免这种情况发生,并且在2个列表框中仍然具有正确的行为?
编辑:
根据https://stackoverflow.com/a/4802483/2492962,我已经达成了一种解决方案(不知道它是否是最好的解决方案):
<h:selectOneMenu id="comunitaValle" value="#{struttura.nomeComunitaDiValle}"
valueChangeListener="#{struttura.getComuniInComunita}" immediate="true">
<a4j:support event="onchange" reRender="cap"/>
<f:selectItems value="#{struttura.comunitaValleList}" />
</h:selectOneMenu>
可以吗? JBoss显示一条警告消息:
INFO [lifecycle] WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
但刷新似乎很好。
答案 0 :(得分:1)
根据https://stackoverflow.com/a/4802483/2492962,我已经达成了一种解决方案(不知道它是否是最好的解决方案):
<h:selectOneMenu id="comunitaValle" value="#{struttura.nomeComunitaDiValle}"
valueChangeListener="#{struttura.getComuniInComunita}" immediate="true">
<a4j:support event="onchange" reRender="cap"/>
<f:selectItems value="#{struttura.comunitaValleList}" />
</h:selectOneMenu>
<h:selectOneMenu id="cap" value="#{struttura.cap}" >
<f:selectItems value="#{struttura.comuneIstatCapList}" />
</h:selectOneMenu>
答案 1 :(得分:0)
说你的JSF看起来像这样:
<h:selectOneMenu id="comunitaValle" value="#{struttura.nomeComunitaDiValle}">
<f:ajax listener="#{struttura.getComuniInComunita}"
execute="@this" render="myListBox" />
<f:selectItems value="#{struttura.comunitaValleList}" />
</h:selectOneMenu>
<h:selectManyListbox id="myListBox" value="#{struttura.backingValueList}">
<f:selectItems value="#{struttura.listBoxValues}" var="val"
itemLabel="#{val.name}" />
</h:selectManyListbox>
您的支持bean需要一个接受getComuniInComunita
参数的方法javax.faces.event.AjaxBehaviorEvent
(有关详细信息,请参阅reference)。
execute
属性将导致JSF仅在调用listener
方法之前更新/验证选择菜单。由于您的选择菜单仅控制列表框,因此您可以在侦听器方法完成后提供要更新的特定组件ID。
答案 2 :(得分:0)
这是JSF1.2的解决方案,使用Richfaces3.3 <a4j:support>
:
<a4j:region>
<h:selectOneMenu id="comunitaValle" value="#{struttura.nomeComunitaDiValle}">
<a4j:support event="onchange" action="#{struttura.getComuniInComunita}"
ajaxSingle="true" reRender="myListBox" limitToList="true" />
<f:selectItems value="#{struttura.comunitaValleList}" />
</h:selectOneMenu>
<h:selectManyListbox id="myListBox" value="#{struttura.backingValueList}">
<f:selectItems value="#{struttura.listBoxValues}" var="val"
itemLabel="#{val.name}" />
</h:selectManyListbox>
</a4j:region>
这是我最接近复制JSF-2的方法。 <a4j:region>
使我们能够将处理限制为页面的子集(与JSF-2中的execute
属性类似)。
此外,您可能会发现Richfaces architecture overview会有所帮助。