6

我有一个组件要在用户点击后显示/隐藏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 toggle(-) 或任何隐藏元素的方式style="display: none"或任何这些东西。

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

4

1 回答 1

10

您无法更新未渲染的元素,rendered=false“是一种 JSF 方式”以从 DOM 树中删除元素,

它不像 css display:none 或 visibility:hidden <- 这两个将保留 DOM 树中的元素但隐藏,而 JSF render=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>

也看看类似的问题

你能从 ap:ajax 监听器更新一个 h:outputLabel 吗?

于 2012-12-08T15:45:54.067 回答