2012-04-30 21 views
9

Hola Tengo este código para hacer que condicionalmente componentes en mi página:prestación condicional en JSF

<h:commandButton action="#{Bean.method()}" value="Submit"> 
    <f:ajax execute="something" render="one two" /> 
</h:commandButton> 

<p><h:outputFormat rendered="#{Bean.answer=='one'}" id="one" value="#{messages.one}"/></p> 
<p><h:outputFormat rendered="#{Bean.answer=='two'}" id="two" value="#{messages.two}"/></p> 

Se pone la respuesta y hace que el componente, pero con el fin de verlo en mi página, que necesite actualizar la página. ¿Como puedo solucionar este problema? ¿Alguna sugerencia?

Respuesta

14

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> 
+0

Gracias por su respuesta. Lo que hice fue que utilicé render = "@ form" en mi formulario y funcionó. También intentaré lo que sugieras. – sandra

+0

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

+0

¿podemos agregar la condición en el render de Ajax? –

-1
style="visibility: #{questionchoose.show==false ? 'hidden' : 'visible'}" 
+0

Es mejor no representar el elemento en absoluto, en lugar de simplemente no mostrarlo. – dwjohnston

3

Yo sé que no es el punto central de la cuestión, pero como tuve este problema muchas veces en el pasado, simplemente lo publico aquí para ayudar a otros que lo necesitan. Para quienes usan PrimeFaces hay un componente en PrimeFaces Extension llamado Switch.

A veces tiene que mostrar diferentes salidas o componentes dependiendo de un valor. Usualmente puede lograr esto usando la etiqueta ui:fragment. Con la etiqueta pe:switch util no tendrá que declarar ui:fragment etiquetas, con diferentes controles como ui:fragment rendered="#{!empty someController.value}", más.