2013-11-25 110 views
1

我有一個列表框,我希望捕獲選擇中的更改以便根據它填充另一個。我試着按以下方式:在不提交表格的情況下更改監聽器

<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

是否使用JSF-2或工具包,提供AJAX的功能?因爲這聽起來像它的標準用例。 – mabi

+0

是的,但我無法做到這一點。任何建議? – AnPe

+0

上述修正:OP根本沒有使用JSF 2.x。 – BalusC

回答

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> 
+0

最後找到它的規範文章:http://balusc.blogspot.de/2007/10/populate-child-menus.html - 我會說你的解決方案,但請閱讀文章的潛在缺陷。 – mabi

+0

太棒了! FacesContext.getCurrentInstance()的renderResponse();是我正在尋找的答案!謝謝! – AnPe

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則需要接受一個javax.faces.event.AjaxBehaviorEvent參數(見reference獲取更多信息)的方法getComuniInComunita

execute屬性將導致JSF在調用listener方法之前僅更新/驗證選擇菜單。由於您的選擇菜單僅控制列表框,您可以在偵聽器方法結束後提供特定組件ID以進行更新。

+0

我在調用public void getComuniInComunita(AjaxBehaviorEvent event) – AnPe

+0

@ user2492962時得到java.lang.ClassNotFoundException: javax.faces.event.AjaxBehaviorEvent *,* *你使用JSF-2嗎?如果沒有,您使用哪個工具包來獲得ajax支持? – mabi

+0

uhm ..也許不是..我剛剛發現這個jsf-facelets-1.1.15.B1 – AnPe

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會有所幫助。

+0

找不到的limitRender屬性。 此外這個解決方案給了我一個例外:org.apache.jasper.el.JspMethodNotFoundException。如果getComuniInComunita返回值是無效的,會不會是一個問題? – AnPe

+0

對不起,'limitRender'在RF3中被稱爲'limitToList',我已經改變了答案。我不確定該方法沒有發現異常。我正在使用帶有RF3的Jboss EL,這在以前的EL版本中受到了限制。因此,您可能需要符合[文檔]中的確切簽名(http://docs.jboss.org/richfaces/3.3.X/3.3.4.Final/en/tlddoc/a4j/support)。 html),它需要一個'Object'返回值。 – mabi

+0

似乎還沒有找到我的方法。如果沒有錯誤,我自己的解決方案似乎更適合。有什麼問題嗎? – AnPe

相關問題