2010-01-08 125 views
3

我有一個JSF頁面,我希望在這個頁面上有一個複選框,當點擊它時,會從頁面添加/刪除某些其他表單域。這裏是(簡化)的代碼,我現在有複選框:JSF ReRender支持selectBooleanCheckbox

<h:selectBooleanCheckbox title="showComponentToReRender" value="#{backingBean.showComponentToReRender}"> 
    <a4j:support event="onsubmit" reRender="componentToReRender" /> 
</h:selectBooleanCheckbox> 

下面是我想隱藏的組件的代碼:

<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}"> 
    <s:selectItems value="#{valuesList}" var="value"/> 
</h:selectOneMenu> 

目前,點擊複選框不執行任何操作;那個「selectOneMenu」不會消失。我究竟做錯了什麼?

回答

9

你需要用的componentToReRender在任:

<h:panelGroup id="componentToReRenderWrapper">

<a4j:outputPanel id="componentToReRenderWrapper">

因此,有效地,你將有:

<h:panelGroup id="componentToReRenderWrapper"> 
    <h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}"> 
     <s:selectItems value="#{valuesList}" var="value"/> 
    </h:selectOneMenu> 
</h:panelGroup> 

,改變reRender="componentToReRenderWrapper"以防您使用panelGroup或刪除該屬性,以防您使用outputPanel

發現於RichFaces文檔的確切的解釋:

使用重新呈現時其指向具有「渲染」屬性的分量最常見的問題。請注意,如果「渲染」條件返回false,那麼JSF不會標記瀏覽器DOM中放置組件結果的位置。因此,在Ajax請求期間呈現組件後,RichFaces將呈現的代碼交付給客戶端,但不更新頁面,因爲更新位置未知。您需要指向沒有「呈現」屬性的父組件之一。作爲替代方案,您可以使用layout =「none」來包裝組件。

+0

似乎它實際上做,但渲染是有點棘手。我從文檔 – Bozho 2010-01-09 05:52:03

+0

的詳細信息更新了我的答案。有趣...我會在星期一早上試試這個。 – iandisme 2010-01-09 21:41:46

+0

將包含要在h:panelGroup中重新渲染的組件按預期工作。我現在遇到的唯一問題是盒子需要幾秒鐘纔會出現/消失,我不知道如何讓用戶知道他們的變化正在受到影響。謝謝!! – iandisme 2010-01-11 17:10:29

2

不要忘記在A4J設置ajaxRendered =「真」:outputPanel