Kann ich eine JSF-Komponente über eine JSF-Backing-Bean-Methode aktualisieren?

100

Gibt es eine Möglichkeit, dass eine JSF-Backing-Bean eine Aktualisierung einer Komponente auf der Seite verursacht? Ich möchte keine Ajax-Komponente mit Update-Attribut verwenden, um eine Komponente auf der Seite zu aktualisieren. Ich muss ein Update innerhalb einer JSF-Backing-Bean-Methode auslösen. Beachten Sie, dass die Aktualisierung auf der Seite nach Abschluss dieser Methode oder vor deren Abschluss erfolgen kann. Ich verwende PrimeFaces, wenn es eine Lösung gibt, die sich aus der Verwendung von PrimeFaces ergibt.

Empfohlene Vorgehensweise
quelle
Kann einen Validierungsfehler auslösen: stackoverflow.com/a/14401741/1599699
Andrew

Antworten:

183

Fügen Sie mithilfe der Standard-JSF-API die Client-ID hinzu PartialViewContext#getRenderIds().

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

Verwenden Sie die PrimeFaces-spezifische API PrimeFaces.Ajax#update().

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

Oder wenn Sie noch nicht auf PrimeFaces 6.2+ sind, verwenden Sie RequestContext#update().

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

Wenn Sie die JSF-Dienstprogrammbibliothek OmniFaces verwenden , verwenden Sie Ajax#update().

Ajax.update("foo:bar");

Beachten Sie unabhängig von der Art und Weise, dass diese Client-IDs absolute Client-IDs darstellen sollten, denen nicht das NamingContainerTrennzeichen vorangestellt ist, wie Sie es von der Ansichtsseite aus tun würden.

BalusC
quelle
6
Es scheint, als ob ich dies während der Render-Antwortphase nicht zum Laufen bringen kann (wo ich leider gezwungen bin, diesen Code zu platzieren). Wenn ich in Invoke Application oder in früheren Phasen platziere, funktionieren die Dinge einwandfrei. Gibt es Problemumgehungen für die Render-Antwortphase?
BestPractices
8
Nein, es ist zu spät. Verschieben Sie den Job, um die Aktionsphase oder vor dem Rendern der Antwortphase aufzurufen. Rufen Sie die Methode von <f:ajax listener>oder<f:event type="preRenderView" listener>
BalusC
Irgendeine Idee, wie man das mit JSF 1.2 macht? Ich kann eine neue Frage stellen, wenn die Antwort zu lang / komplex ist.
RinaldoPJr
@RinaldoPJr: JSF 1.2 hat kein Konzept von <f:ajax>. Dies wird seit JSF 2.0 eingeführt. Sie müssen auf spezifische Funktionen der JSF 1.2-Komponentenbibliothek zurückgreifen.
BalusC
@ DanielK: Keine Ahnung. Ich mache kein Trinidad. Verwenden Sie einfach den Standard-JSF-API-Ansatz, wenn Sie den Trinidad-Weg immer noch nicht kennen.
BalusC
9

Ich habe auch versucht, eine Komponente von einer jsf-Backing-Bean / Klasse zu aktualisieren

Nach dem Bearbeiten der UI-Komponente müssen Sie Folgendes tun:

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

Es ist wichtig, die clientId anstelle der (serverseitigen) componentId zu verwenden !!

Frithjof Schäfer
quelle
1

Alles ist nur möglich, wenn genügend Zeit für Recherchen vorhanden ist :)

Was ich tun muss, ist, Leute zu haben, die ich in eine Benutzeroberfläche iteriere: Wiederholen und Anzeigen von Namen und anderen Feldern in Eingaben. Aber eines der Felder war singleSelect - A und je nach Wert aktualisieren Sie eine andere Eingabe - B. sogar ui: repeat habe keine ID, die ich eingegeben habe, und sie wurde im DOM-Baum angezeigt

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

Dann waren die IDs im HTML so etwas wie:

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

Als in der Ansicht habe ich eine Methode wie:

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

Und seine Umsetzung war in der Bohne wie:

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

Auf diese Weise habe ich das Element aus der Bean ohne Probleme aktualisiert. PF Version 6.2

Viel Glück und viel Spaß beim Codieren :)

panayot_kulchev_bg
quelle
Wenn Sie das Ajax-Änderungsereignis auf dem haben personType, ist es überflüssig, sowohl die Person als auch den Index an den Ajax-Listener weiterzuleiten. Sie können sowohl die ID als auch den Wert aus dem Ereignis abrufen. Möglicherweise ist Ihre Lösung für Ihren speziellen Anwendungsfall erforderlich, aber da es kein vollständiges Beispiel gibt (mit minimal reproduzierbarem Beispielgeschmack ), ist es schwer zu sagen.
Kukeltje