El atributo rendered
del componente JSF es una configuración del lado del servidor que controla si JSF debe generar el HTML deseado o no.
atributo de la etiqueta <f:ajax>
render
debe apuntar a una (relativa) ID de cliente del elemento HTML generado por el JSF, que JavaScript puede agarrar por document.getElementById()
del árbol DOM HTML con el fin de reemplazar a su contenido en la solicitud completa de ajax.
Sin embargo, como está especificando el ID de cliente de un elemento HTML que nunca es renderizado por JSF (debido a que rendered
es false
), JavaScript no puede encontrarlo en el árbol HTML DOM.
Necesitas envolverlo en un componente contenedor que es siempre prestados y por lo tanto siempre disponibles en el árbol DOM HTML.
<h:commandButton action="#{Bean.method()}" value="Submit">
<f:ajax execute="something" render="messages" />
</h:commandButton>
<p>
<h:panelGroup id="messages">
<h:outputFormat rendered="#{Bean.answer=='one'}" value="#{messages.one}"/>
<h:outputFormat rendered="#{Bean.answer=='two'}" value="#{messages.two}"/>
</h:panelGroup>
</p>
Sin relación al problema concreto, que haya allí un posible error de diseño. ¿Por qué no acaba de crear un #{Bean.message}
propiedad que se establece con el mensaje deseado en el método de acción en su lugar, para que sólo se puede utilizar:
<h:commandButton action="#{Bean.method()}" value="Submit">
<f:ajax execute="something" render="message" />
</h:commandButton>
<p>
<h:outputFormat id="message" value="#{Bean.message}" />
</p>
Gracias por su respuesta. Lo que hice fue que utilicé render = "@ form" en mi formulario y funcionó. También intentaré lo que sugieras. – sandra
Eso también funcionará, siempre y cuando el padre del componente sea * siempre * prestado (exactamente como mi respuesta está tratando de decírselo). Tal vez solo haya una sobrecarga innecesaria si el formulario contiene otros 10 componentes que no necesitan actualizarse en absoluto, por ejemplo. – BalusC
¿podemos agregar la condición en el render de Ajax? –