2012-12-08 88 views
5

我有一个组件,我想在用户点击commandButton后显示/隐藏。AJAX渲染属性不适用于渲染=“false”组件

是这样的:

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

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

bean.toggle()只是适当的wasPressed属性设置为true或false。我正在使用<h:form prependId="false">

问题是我的按钮的render属性的值。它明确列举了:explanationshowButton

只要showButton总是存在(它只会更改其标签),则explanation仅在wasPressed属性为true时才存在。否则,它说:

malformedXML:在更新:explanaition没有找到

我怎样才能解决这个问题?

我不想回复隐藏源代码中的元素,所以我不想使用任何jQuery切换( - )或任何隐藏元素使用style="display: none"或任何这些东西。

它甚至可以在JSF 2.1中实现吗?

+2

包装添加到panelGroup中有一个ID,并指它....你不能指不会呈现JSF elememt的http://计算器。 com/a/10707789/617373 – Daniel

+0

工程就像一个魅力,谢谢!你能否给这个问题添加答案,以便我能够接受它? –

+0

不客气。 – Daniel

回答

9

不能更新未渲染的元素,呈现=假“是一个JSF办法”中删除从DOM树中的元素,

它不是如CSS display:none或visibility:hidden的< - 这两将保留DOM树中的元素但隐藏,而JSF呈现= false将不会在DOM树中呈现(保留)元素(甚至不会在页面的“视图源”中看到它)

所以在你的情况下,你需要用另一个`panelGroup'包装panelGroup并更新包装的ID

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

还看类似的问题

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