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

时间:2012-12-08 12:58:39

标签: ajax jsf-2 java-ee-6 facelets show-hide

我有一个组件,我想在用户点击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属性的值。它明确地同时列出了explanationshowButton

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

  

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

我该如何解决这个问题?

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

在JSF 2.1中是否可以实现?

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>

也看一下类似的问题

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