2012-03-15 1 views
5

Ecco la mia casella di controllo. Sto preparando una stringa delimitata da virgole di ID dei componenti nel listener. Il problema qui è che viene chiamato getter getUpdateComponentList() prima che il listener venga chiamato. Quindi la stringa non viene mai aggiornata.p: getter ajax per l'aggiornamento chiamato prima dell'ascoltatore

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

risposta

9

Questo è il comportamento previsto. PrimeFaces (e JSF standard) non rivalutano gli attributi update (e , ecc.) In base alle richieste. Sono valutati in base alla vista. RichFaces, ad esempio, lo fa nel suo <a4j:ajax> e restituisce esattamente il comportamento previsto.

Per PrimeFaces, la soluzione migliore è rimuovere l'attributo update e utilizzare invece RequestContext#addPartialUpdateTarget() o #addPartialUpdateTargets() nel metodo di azione.

E.g.

RequestContext.getCurrentInstance().addPartialUpdateTargets(updateComponentList); 

Prende Collection<String> come List<String> o Set<String>.

A proposito, quello event="change" non è necessario. Basta usare l'evento predefinito del componente.


Aggiornamento per gli utenti di una versione più recente primefaces che stanno leggendo questa risposta più tardi e non riescono a trovare i metodi di cui sopra, che sono effettivamente rimossi in una versione più recente primefaces; utilizzare invece uno dei due metodi update() (uno prende uno String e un altro prende uno Collection<String>).

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

@Balusc, potete darmi un exemple per favore? ! –

+0

perché non riesco a trovare il metodo addPartialUpdateTargets –

+1

@berber: è stato deprecato in PrimeFaces 3.2 e rimosso in PrimeFaces 3.4. Hai invece bisogno del metodo 'update()'. – BalusC

2

ho affrontato un problema simile di 'aggiornamento' della sedia elettrica prima del 'ascoltatore'. Mettendo due "p: ajax", uno con l'ascoltatore e l'altro con l'aggiornamento, ha fatto il trucco.

Nel tuo caso:

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