2012-12-08 10 views
5

Ho un componente che voglio mostrare/nascondere dopo che l'utente ha colpito un commandButton.L'attributo di rendering AJAX non funziona con il componente reso = "false"

E 'in questo modo:

<h:commandButton id="showButton" value="#{bean.wasPressed ? 'Hide' : 'Show'}"> 
    <f:ajax listener="#{bean.toggle()}" render="explanation showButton" /> 
</h:commandButton> 

e

<h:panelGroup id="explanation" rendered="#{bean.wasPressed}"> 
    <h:outputText value="something" /> 
</h:panelGroup> 

Il bean.toggle() imposta semplicemente la proprietà wasPressed true o false in modo appropriato. Sto usando <h:form prependId="false">.

Il problema è il valore dell'attributo render del mio pulsante. Incorpora esplicitamente entrambi: explanation e showButton.

Finché lo showButton è sempre presente (cambia solo l'etichetta), lo explanation è presente solo se la proprietà wasPressed è vera. In caso contrario, si dice:

malformedXML: Durante l'aggiornamento: explanaition non trovato

Come posso risolvere questo problema?

Vorrei non tornare a nascondere l'elemento nel codice sorgente, quindi mi piacerebbe non utilizzare alcun javery toggle (-) o alcun modo di nascondere l'elemento usando style="display: none" o una qualsiasi di queste cose.

È persino ottenibile in JSF 2.1?

+2

Aggiungi un involucro a quella panelGroup con un id e fare riferimento ad esso .... non si può fare riferimento a un elememt http JSF non fusi: // StackOverflow. it/a/10707789/617373 – Daniel

+0

Funziona come un incanto, grazie! Potresti per favore aggiungere una risposta a questa domanda così potrò accettarla? –

+0

Siete i benvenuti. – Daniel

risposta

9

Non è possibile aggiornare gli elementi che non sono resi, resa = false "è un modo JSF per" per rimuovere elementi dalla struttura DOM,

non è come CSS display: none o visibility: hidden < - questo due manterrà gli elementi nell'albero DOM ma nascosto, mentre il rendering JSF = false non renderà nemmeno (mantenere) l'elemento nell'albero DOM (non lo vedrai nemmeno nella "vista sorgente" della pagina)

Quindi nel tuo caso hai bisogno di avvolgere il gruppo Panel con un altro `panelGroup 'e aggiornare l'id del wrapper

<h:commandButton id="showButton" value="#{bean.wasPressed ? 'Hide' : 'Show'}"> 
    <f:ajax listener="#{bean.toggle()}" render="explanationWrapper showButton" /> 
</h:commandButton> 


<h:panelGroup id="explanationWrapper"> 
    <h:panelGroup id="explanation" rendered="#{bean.wasPressed}"> 
     <h:outputText value="something" /> 
    </h:panelGroup> 
</h:panelGroup> 

un'occhiata anche domanda simile

Can you update an h:outputLabel from a p:ajax listener?

Problemi correlati