2012-04-30 12 views
9

Ciao Ho questo codice per rendere condizionale componenti nella mia pagina:resa condizionale in 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> 

Si ottiene la risposta e rende il componente, ma per vedere sulla mia pagina, ho bisogno di aggiornare la pagina. Come posso risolvere questo problema? Eventuali suggerimenti?

risposta

14

L'attributo rendered del componente JSF è un'impostazione lato server che controlla se JSF deve generare o meno l'HTML desiderato.

attributi del tag <f:ajax>render dovrebbe puntare a una (relativa) ID client dell'elemento HTML JSF-generated che JavaScript può afferrare da document.getElementById() da HTML DOM albero al fine di sostituire il contenuto sul totale della richiesta Ajax.

Tuttavia, poiché si specifica l'ID client di un elemento HTML che non viene mai visualizzato da JSF (a causa di renderedfalse), JavaScript non può trovarlo nella struttura DOM HTML.

È necessario avvolgerlo in un componente contenitore che è sempre resi e quindi sempre disponibili nella struttura HTML DOM.

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

Estranei al problema concreto, lì hai un possibile errore di progettazione. Perché non si solo creare una proprietà #{Bean.message}, che si imposta con il messaggio desiderato nel metodo di azione, invece, in modo che si può semplicemente utilizzare:

<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

Grazie per la risposta. Quello che ho fatto è che ho usato render = "@ form" nel mio modulo e ha funzionato. Proverò comunque quello che hai suggerito. – sandra

+0

Anche questo funzionerà, purché sia ​​il genitore del componente che è * sempre * reso (esattamente come la mia risposta sta cercando di dirti). C'è forse solo un sovraccarico non necessario se il modulo contiene 10 altri componenti che non devono essere necessariamente aggiornati, ad esempio. – BalusC

+0

possiamo aggiungere condizioni nel rendering ajax? –

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

È meglio non rendere l'oggetto affatto, piuttosto che non visualizzarlo. – dwjohnston

3

io so che non è il punto centrale della questione, ma visto che ho avuto questo problema molte volte in passato, ho appena postato qui per aiutare gli altri che hanno bisogno. Per coloro che utilizza PrimeFaces c'è un componente in PrimeFaces Extension chiamato Switch.

A volte è necessario visualizzare diverse uscite o componenti in base a un valore. Di solito è possibile ottenere ciò utilizzando il tag ui:fragment. Con il tag util pe:switch non è necessario dichiarare tag ui:fragment, con controlli diversi come ui:fragment rendered="#{!empty someController.value}", più.