Posso aggiornare un componente JSF da un metodo del backing bean JSF?


100

C'è un modo per fare in modo che un bean di supporto JSF provochi un aggiornamento di un componente sulla pagina? Non sto cercando di utilizzare un componente ajax con l'attributo update per aggiornare un componente sulla pagina. Devo attivare un aggiornamento dall'interno di un metodo bean di backup JSF. Nota che l'aggiornamento sulla pagina può avvenire dopo il completamento di questo metodo o prima del suo completamento. Sto usando PrimeFaces, se c'è una soluzione che può essere ottenuta usando PrimeFaces.


Può attivare un errore di convalida: stackoverflow.com/a/14401741/1599699
Andrew

Risposte:


183

Utilizzando l'API JSF standard, aggiungi l'ID client a PartialViewContext#getRenderIds().

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

Utilizzando l'API specifica di PrimeFaces, usa PrimeFaces.Ajax#update().

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

O se non sei ancora su PrimeFaces 6.2+, usa RequestContext#update().

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

Se ti capita di utilizzare la libreria di utilità JSF OmniFaces , usa Ajax#update().

Ajax.update("foo:bar");

Indipendentemente dal modo, nota che quegli ID client dovrebbero rappresentare ID client assoluti che non sono preceduti dal NamingContainercarattere separatore come faresti dal lato di visualizzazione in avanti.


6
Sembra che non riesca a farlo funzionare durante la fase di risposta del rendering (che, sfortunatamente, è dove sono costretto a inserire questo codice). Se inserisco Invoke Application o nelle fasi precedenti, le cose funzionano bene. Qualche soluzione alternativa per essere nella fase di risposta del rendering?
BestPractices

8
No, è troppo tardi. Spostare il lavoro per richiamare la fase di azione o prima della fase di risposta del rendering. Richiamare il metodo con <f:ajax listener>o<f:event type="preRenderView" listener>
BalusC

Qualche idea su come farlo con JSF 1.2? Posso fare una nuova domanda se la risposta è troppo lunga / complessa.
RinaldoPJr

@RinaldoPJr: JSF 1.2 non ha il concetto di <f:ajax>. Questo è stato introdotto da JSF 2.0. Avresti bisogno di ricorrere a strutture specifiche della libreria dei componenti JSF 1.2.
BalusC

@DanielK: Nessuna idea. Non faccio Trinidad. Usa l'approccio standard dell'API JSF se ancora non riesci a capire il modo Trinidad.
BalusC

9

Ho anche provato ad aggiornare un componente da un bean / class di supporto jsf

È necessario eseguire le seguenti operazioni dopo aver manipolato il componente dell'interfaccia utente:

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

È importante utilizzare clientId invece di componentId (lato server) !!



1

Tutto è possibile solo se c'è abbastanza tempo per la ricerca :)

Quello che devo fare è come avere persone che iterano in un'interfaccia utente: ripetere e visualizzare nomi e altri campi negli input. Ma uno dei campi era singleSelect - A e, a seconda del valore, aggiorna un altro input - B. anche ui: ripeti non ho l'ID che ho messo ed è apparso nell'albero DOM

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

Quindi gli ID nell'html erano qualcosa del tipo:

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

Poi nella vista ho un metodo come:

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

E la sua implementazione era nel fagiolo come:

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

Quindi in questo modo ho aggiornato l'elemento dal bean senza problemi. Versione PF 6.2

Buona fortuna e buona programmazione :)


Se hai l'evento di modifica ajax su personType, passare sia la persona che l'indice all'ascoltatore ajax è superfluo. Puoi ottenere sia l'id che il valore dall'evento. Ma la tua soluzione potrebbe essere necessaria per il tuo caso d'uso specifico, ma poiché non esiste un esempio completo (in un esempio minimo riproducibile ) è difficile da dire.
Kukeltje
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.