Pio*_*cki 5 ajax facelets show-hide java-ee-6 jsf-2
我有一个组件,我想在用户点击后显示/隐藏commandButton.
就像这样:
<h:commandButton id="showButton" value="#{bean.wasPressed ? 'Hide' : 'Show'}">
<f:ajax listener="#{bean.toggle()}" render="explanation showButton" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
和
<h:panelGroup id="explanation" rendered="#{bean.wasPressed}">
<h:outputText value="something" />
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
在bean.toggle()简单地设置wasPressed属性为true或false适当.我在用<h:form prependId="false">.
问题是render我的按钮属性的值.它明确地征服了两者:explanation和showButton.
只要showButton始终存在(它只更改其标签),explanation仅当wasPressed属性为true 时才存在.否则它说:
malformedXML:更新期间:找不到解释
我怎么解决这个问题?
我不想恢复隐藏源代码中的元素,所以我不想使用任何jQuery切换( - )或任何使用style="display: none"或任何这些东西隐藏元素的方式.
它甚至可以在JSF 2.1中实现吗?
您无法更新未呈现的元素,render = false"是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>
Run Code Online (Sandbox Code Playgroud)
也看看类似的问题
你能从ap:ajax监听器更新一个h:outputLabel吗?