我有一个组件,我想在用户点击commandButton
后显示/隐藏。
就是这样:
<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
属性的值。它明确地同时列出了explanation
和showButton
。
只要showButton
始终存在(它只更改其标签),explanation
仅在wasPressed
属性为真时才存在。否则它说:
malformedXML:更新期间:未找到解释
我该如何解决这个问题?
我不想恢复隐藏源代码中的元素,所以我不想使用任何jQuery切换( - )或使用style="display: none"
或任何这些东西隐藏元素的任何方式。
在JSF 2.1中是否可以实现?
答案 0 :(得分:9)
你无法更新未渲染的元素,render = false“是一种JSF方式来”从DOM树中删除元素,
它不像css display:none或visibility:hidden&lt; - 这两个将保留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>
也看一下类似的问题