2012-03-15 12 views
5

Oto moje pole wyboru. Przygotowuję rozdzielany przecinkami ciąg identyfikatorów składowych w słuchaczu. Problem polega na tym, że geter getUpdateComponentList() jest wywoływany przed wywołaniem detektora. Więc ciąg nigdy nie jest aktualizowany.p: ajax getter dla aktualizacji wywołanej przed słuchaczem

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

Odpowiedz

9

To jest normalne zachowanie. PrimeFaces (i standardowy JSF) nie dokonuje ponownej oceny atrybutów update (i render, oncomplete itd.) Na podstawie pojedynczego żądania. Są one oceniane w ujęciu per-view. RichFaces, na przykład, robi to w swoim <a4j:ajax> i zapewnia dokładnie oczekiwane zachowanie.

W przypadku PrimeFaces najlepiej jest usunąć atrybut update i zamiast tego użyć metody RequestContext#addPartialUpdateTarget() lub w metodzie akcji.

E.g.

RequestContext.getCurrentInstance().addPartialUpdateTargets(updateComponentList); 

To trwa Collection<String> takie jak List<String> lub Set<String>.

Przy okazji, to event="change" jest niepotrzebne. Wystarczy użyć domyślnego zdarzenia komponentu.


Aktualizacja dla użytkowników nowszej wersji PrimeFaces którzy czytają tę odpowiedź później i nie może znaleźć wyżej wymienionych metod, które są faktycznie usunięte w nowszej wersji PrimeFaces; zamiast tego użyj jednej z dwóch metod: String, a druga zajmuje Collection<String>).

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

@Balusc, możesz dać mi jeden exemple proszę? ! –

+0

ponieważ nie mogę znaleźć metody addPartialUpdateTargets: –

+1

@berber: Została ona wycofana w PrimeFaces 3.2 i została usunięta w PrimeFaces 3.4. Potrzebujesz zamiast tego metody 'update()'. – BalusC

2

Napotkałem podobny problem dotyczący "aktualizacji", która jest wykonywana przed "słuchaczem". Umieszczenie dwóch "p: ajax" -jeden z słuchaczem i innych z aktualizacją - załatwił sprawę.

W twoim przypadku:

<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> 
Powiązane problemy