Czy mogę zaktualizować komponent JSF z metody komponentu bean zapasowego JSF?

100

Czy istnieje sposób, aby komponent bean JSF Backing powodował aktualizację komponentu na stronie? Nie chcę używać komponentu Ajax z atrybutem aktualizacji do aktualizowania komponentu na stronie. Muszę wyzwolić aktualizację w ramach metody komponentu bean JSF. Zauważ, że aktualizacja na stronie może nastąpić po zakończeniu tej metody lub przed jej zakończeniem. Używam PrimeFaces, jeśli istnieje rozwiązanie, które można uzyskać za pomocą PrimeFaces.

Najlepsze praktyki
źródło
Może wywołać błąd weryfikacji: stackoverflow.com/a/14401741/1599699
Andrew

Odpowiedzi:

183

Korzystając ze standardowego interfejsu API JSF, dodaj identyfikator klienta do PartialViewContext#getRenderIds().

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

Korzystając z określonego interfejsu API PrimeFaces, użyj PrimeFaces.Ajax#update().

PrimeFaces.current().ajax().update("foo:bar");

Lub jeśli nie korzystasz jeszcze z PrimeFaces 6.2+, użyj RequestContext#update().

RequestContext.getCurrentInstance().update("foo:bar");

Jeśli używasz biblioteki narzędziowej JSF OmniFaces , użyj Ajax#update().

Ajax.update("foo:bar");

Niezależnie od sposobu zwróć uwagę, że te identyfikatory klientów powinny reprezentować bezwzględne identyfikatory klientów, które nie są poprzedzone znakiem NamingContainerseparatora, tak jak w przypadku widoku.

BalusC
źródło
6
Wygląda na to, że nie mogę tego uruchomić podczas fazy Render Response (w której niestety jestem zmuszony umieścić ten kod). Jeśli umieszczę w aplikacji Invoke lub we wcześniejszych fazach, wszystko działa dobrze. Czy są jakieś obejścia związane z byciem w fazie Render Response?
BestPractices
8
Nie, jest już za późno. Przenieś zadanie, aby wywołać fazę akcji lub przed fazą odpowiedzi renderowania. Wywołaj metodę do <f:ajax listener>lub<f:event type="preRenderView" listener>
BalusC,
Masz jakiś pomysł, jak to zrobić z JSF 1.2? Mogę zadać nowe pytanie, jeśli odpowiedź jest zbyt długa / złożona.
RinaldoPJr
@RinaldoPJr: JSF 1.2 nie ma pojęcia <f:ajax>. Jest to wprowadzone od JSF 2.0. Będziesz musiał skorzystać z udogodnień specyficznych dla biblioteki komponentów JSF 1.2.
BalusC,
@DanielK: Nie mam pojęcia. Nie robię Trynidadu. Po prostu użyj standardowego podejścia JSF API, jeśli nadal nie możesz znaleźć sposobu na Trynidad.
BalusC
9

Próbowałem również zaktualizować komponent z komponentu bean / class zapasowego JSF

Po manipulowaniu komponentem interfejsu użytkownika musisz wykonać następujące czynności:

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

Ważne jest, aby używać clientId zamiast (po stronie serwera) componentId !!

Frithjof Schaefer
źródło
1

Wszystko jest możliwe tylko wtedy, gdy jest wystarczająco dużo czasu na badania :)

To, co muszę zrobić, to jak mieć ludzi, których iteruję w interfejsie użytkownika: powtarzam i wyświetlam nazwy oraz inne pola w danych wejściowych. Ale jedno z pól było pojedyncze Wybierz - A i zależnie od tego wartość zaktualizuj kolejne wejście - B. nawet ui: powtórz nie mam id wstawiłem i pojawiło się w drzewie DOM

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

Niż identyfikatory w html wyglądały tak:

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

Niż w widoku dostałem jedną metodę jak:

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

A jego realizacja była w fasoli:

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

W ten sposób zaktualizowałem element z fasoli bez żadnych problemów. PF wersja 6.2.0

Powodzenia i miłego kodowania :)

panayot_kulchev_bg
źródło
Jeśli masz zdarzenie zmiany AJAX na stronie personType, przekazywanie zarówno osoby, jak i indeksu do nasłuchującego AJAX jest zbędne. Możesz uzyskać zarówno identyfikator, jak i wartość ze zdarzenia. Ale twoje rozwiązanie może być potrzebne w twoim konkretnym przypadku, ale ponieważ nie ma pełnego przykładu (w minimalnym powtarzalnym smaku przykładu ), trudno powiedzieć.
Kukeltje