2014-06-18 34 views
2

我使用JSF 2和Primefaces 4,並有以下問題:號碼:阿賈克斯更新不與對工作:selectBooleanCheckbox

我有下面的代碼在我的XHTML:

<h:form id="form"> 
<table> 
    <tr id="formats"> 
     <td>Formats</td> 
     <td> 
      <p:selectBooleanCheckbox value="#{bean.entity.formatted}"> 
       <p:ajax event="change" update="formatsSelect" /> 
      </p:selectBooleanCheckbox> 
      <p:selectOneMenu id="formatsSelect" rendered="#{bean.entity.formatted}"> 
       <f:selectItems value="#{bean.formats}" /> 
      </p:selectOneMenu> 
     </td> 
    </tr> 
</table> 
</h:form> 

它輸出一個複選框和一個選擇菜單,我期望的是,當我檢查複選框時,選擇菜單應該出現,並且當我取消選中時應該消失....但沒有任何反應,我檢查並取消選中它,並且選擇菜單不受影響。

理論上這應該工作,因爲selectBooleanCheckbox值綁定到entity.formatted布爾值,並且selectOneMenu中的呈現值綁定到entity.formatted值並且p:ajax指向更新中的正確id屬性和事件是正確的。這最後一點我知道,因爲我創造了我的bean的偵聽器打印的格式的值:

public void changeListener(){ 
    System.out.println(this.entity.isFormatted()); 
} 

,改變了電話號碼:阿賈克斯:

<p:ajax event="change" update="formatsSelect" listener="#{bean.changeListener}" /> 

它輸出的值的格式控制檯。 我在做什麼錯?

回答

7

由於您在組件(p:selectOneMenu id="formatsSelect")上使用了rendered並更新了相同的組件,因此無法工作。

因爲該組件在更新時可能尚未添加到/存在於組件樹中。

因此,圍繞它使用一個h:panelGroup並更新它並使用renderedp:selectOneMenu

<p:selectBooleanCheckbox value="#{bean.entity.formatted}"> 
     <p:ajax event="change" update="formatsSelectPG" /> 
</p:selectBooleanCheckbox> 

<h:panelGroup id="formatsSelectPG"> 
     <p:selectOneMenu id="formatsSelect" rendered="#{bean.entity.formatted}"> 
      <f:selectItems value="#{bean.formats}" /> 
     </p:selectOneMenu> 
</h:panelGroup>