AJAX渲染属性不适用于rendered ="false"组件

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我的按钮属性的值.它明确地征服了两者:explanationshowButton.

只要showButton始终存在(它只更改其标签),explanation仅当wasPressed属性为true 时才存在.否则它说:

malformedXML:更新期间:找不到解释

我怎么解决这个问题?

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

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

Dan*_*iel 9

您无法更新未呈现的元素,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吗?