¿Puedo actualizar un componente JSF desde un método de bean de respaldo JSF?


100

¿Hay alguna forma de que un bean de respaldo JSF provoque una actualización de un componente en la página? No estoy buscando usar un componente ajax con el atributo de actualización para actualizar un componente en la página. Necesito activar una actualización desde dentro de un método de frijol de respaldo JSF. Tenga en cuenta que la actualización en la página puede ocurrir después de que se complete este método o antes de que se complete. Estoy usando PrimeFaces, si hay una solución que se pueda obtener usando PrimeFaces.


Puede desencadenar un error de validación: stackoverflow.com/a/14401741/1599699
Andrew

Respuestas:


183

Usando la API JSF estándar, agregue el ID de cliente a PartialViewContext#getRenderIds().

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

Usando la API específica de PrimeFaces, use PrimeFaces.Ajax#update().

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

O si aún no está en PrimeFaces 6.2+, use RequestContext#update().

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

Si utiliza la biblioteca de utilidades JSF OmniFaces , utilice Ajax#update().

Ajax.update("foo:bar");

Independientemente de la forma, tenga en cuenta que esas ID de cliente deben representar las ID de cliente absolutas que no tienen el prefijo del NamingContainercarácter separador como lo haría desde el lado de la vista.


6
Parece que no puedo hacer que esto funcione durante la fase de Respuesta de procesamiento (que, desafortunadamente, es donde me veo obligado a colocar este código). Si coloco en Invoke Application o en fases anteriores, las cosas funcionan bien. ¿Alguna solución para estar en la fase de respuesta de procesamiento?
BestPractices

8
No, es muy tarde. Mueva el trabajo para invocar la fase de acción o antes de renderizar la fase de respuesta. Invocar el método por <f:ajax listener>o<f:event type="preRenderView" listener>
BalusC

¿Alguna idea de cómo hacer eso con JSF 1.2? Puedo hacer una nueva pregunta si la respuesta es demasiado larga / compleja.
RinaldoPJr

@RinaldoPJr: JSF 1.2 no tiene concepto de <f:ajax>. Esto se introduce desde JSF 2.0. Debería recurrir a las instalaciones específicas de la biblioteca de componentes JSF 1.2.
BalusC

@DanielK: No tengo idea. Yo no hago Trinidad. Simplemente use el enfoque estándar de la API JSF si aún no puede descubrir el camino de Trinidad.
BalusC

9

También intenté actualizar un componente de un bean / clase de respaldo jsf

Debe hacer lo siguiente después de manipular el componente de la interfaz de usuario:

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

¡Es importante usar el clientId en lugar del componentId (del lado del servidor)!



1

Todo es posible solo si hay suficiente tiempo para investigar :)

Lo que tengo que hacer es como tener personas que iteraré en una interfaz de usuario: repetir y mostrar nombres y otros campos en las entradas. Pero uno de los campos era singleSelect - A y, dependiendo de este valor, actualice otra entrada - B. incluso ui: repetir no tengo id que puse y apareció en el árbol DOM

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

Que los identificadores en el html eran algo como:

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

Que en la vista tengo un método como:

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

Y su implementación fue en el bean como:

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

Así que de esta manera actualicé el elemento del bean sin problemas. PF versión 6.2

Buena suerte y feliz codificación :)


Si tiene el evento de cambio de ajax en el personType, entonces pasar tanto la persona como el índice al oyente de ajax es superfluo. Puede obtener tanto la identificación como el valor del evento. Pero su solución puede ser necesaria para su caso de uso específico, pero como no hay un ejemplo completo (en un sabor de ejemplo reproducible mínimo ) es difícil saberlo.
Kukeltje
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.