2012-03-15 23 views
5

這是我的複選框。我正在準備監聽器中逗號分隔的組件ID字符串。這裏的問題是getter getUpdateComponentList()在調用監聽器之前被調用。所以字符串從不更新。p:ajax getter用於在收聽者之前調用更新

<p:outputPanel> 
<h:selectManyCheckbox value="#{form.colors}"> 
    <f:selectItems value="#{form.colorItems}"/> 
    <p:ajax listener="#{form.testListener}" event="change" update="#{form.updateComponentList}" /> 
</h:selectManyCheckbox> 
</p:outputPanel> 

回答

9

這是預期的行爲。 PrimeFaces(和標準JSF)不會根據每個請求重新評估update(和renderoncomplete等)屬性。他們在每個視圖基礎上進行評估。例如,RichFaces在它的<a4j:ajax>中執行它,併產生完全預期的行爲。

對於PrimeFaces,最好的辦法是消除update屬性和操作方法使用RequestContext#addPartialUpdateTarget()#addPartialUpdateTargets()代替。

E.g.

RequestContext.getCurrentInstance().addPartialUpdateTargets(updateComponentList); 

它需要一個諸如List<String>Set<String>Collection<String>

順便說一句,那event="change"是不必要的。只需使用該組件的默認事件即可。


誰是後來讀這個答案並不能找到它們在較新的版本PrimeFaces確實刪除了上述方法的一個較新的PrimeFaces版本的用戶更新;改用兩種update()方法中的一種(一種需要String,其他需要Collection<String>)。

RequestContext.getCurrentInstance().update(updateComponentList); 
+0

@Balusc,你能不能給我一個爲例好嗎? ! – 2012-11-27 10:48:50

+0

,因爲我找不到addPartialUpdateTargets方法 – 2012-11-27 12:55:24

+1

@berber:它已在PrimeFaces 3.2中被棄用,並在PrimeFaces 3.4中被刪除。您需要'update()'方法。 – BalusC 2012-11-27 12:59:25

2

我面臨着類似的問題'更新'在'偵聽器'之前執行。把兩個'p:ajax' - 一個與監聽器和另一個與更新 - 做了訣竅。

你的情況:

<p:outputPanel> 
    <h:selectManyCheckbox value="#{form.colors}"> 
    <f:selectItems value="#{form.colorItems}"/> 
    <p:ajax event="change" listener="#{form.testListener}" /> 
    <p:ajax event="change" update="#{form.updateComponentList}" /> 
    </h:selectManyCheckbox> 
</p:outputPanel> 
相關問題