2012-12-08 3 views
5

Ich habe eine Komponente, die ich zeigen/ausblenden möchte, nachdem Benutzer eine commandButton trifft.AJAX Renderattribut funktioniert nicht mit gerenderten = "false" Komponente

Es ist so:

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

und

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

Die bean.toggle() einfach die entsprechend wasPressed Eigenschaft auf true oder false setzt. Ich benutze <h:form prependId="false">.

Das Problem ist der Wert des Attributs render meiner Schaltfläche. Es bezieht sich explizit auf beide: explanation und showButton.

Solange die showButton immer vorhanden ist (sie ändert nur ihre Bezeichnung), ist explanation nur vorhanden, wenn die wasPressed Eigenschaft wahr ist. Ansonsten heißt es:

malformedXML: Während des Update: explanaition nicht

gefunden

Wie kann ich dieses Problem lösen?

Ich möchte nicht das Element im Quellcode verstecken, also würde ich gerne keine jQuery toggle (-) oder irgendeine Art des Versteckens des Elements mit style="display: none" oder irgendwelche dieser Sachen verwenden.

Ist es sogar in JSF 2.1 erreichbar?

+2

einen Wrapper zu diesem panelGroup mit id und darauf verweisen .... Sie JSF Elememt http einem nicht gerendert nicht beziehen können: // Stackoverflow. com/a/10707789/617373 – Daniel

+0

Funktioniert wie ein Charme, danke! Könnten Sie bitte eine Antwort auf diese Frage hinzufügen, damit ich sie akzeptieren kann? –

+0

Gern geschehen. – Daniel

Antwort

9

Sie können keine Elemente aktualisieren, die nicht wiedergegeben werden, gerendert = false „ist ein JSF Weg“, um Elemente aus dem DOM-Baum zu entfernen,

seine nicht css Anzeige mag: keine oder Sichtbarkeit: < versteckt - diese zwei behält die Elemente in der DOM-Struktur aber versteckt, während JSF gerendert = false nicht einmal das Element in der DOM-Struktur rendert (Sie werden es nicht einmal in der "Ansichtsquelle" der Seite sehen)

So In diesem Fall müssen Sie die panelGroup mit einer anderen `panelGroup 'umschließen und die ID des Wrappers

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

auch einen Blick auf ähnlicher Frage

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

Verwandte Themen