在不提交表单的情况下更改监听器

时间:2013-11-25 08:51:52

标签: ajax jsf richfaces jsf-1.2

我有一个列表框,我想抓住选择中的变化,以便根据它填充另一个。我试过以下方式:

<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.

但刷新似乎很好。

3 个答案:

答案 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会有所帮助。