【问题标题】:AJAX render attribute doesn't work with rendered="false" component [duplicate]AJAX 渲染属性不适用于 render="false" 组件 [重复]
【发布时间】:2012-11-26 11:49:26
【问题描述】:

我有一个组件要在用户点击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。我正在使用&lt;h:form prependId="false"&gt;

问题是我的按钮的render 属性的值。它明确列出了explanationshowButton

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

malformedXML:更新期间:未找到说明

我该如何解决这个问题?

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

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

【问题讨论】:

  • 使用 id 向该 panelGroup 添加一个包装器并引用它....您不能引用未呈现的 jsf elememt stackoverflow.com/a/10707789/617373
  • 像魅力一样工作,谢谢!能否请您添加此问题的答案,以便我能够接受?

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


【解决方案1】:

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

它不像 css display:none 或 visibility:hidden

所以在你的情况下,你需要用另一个 `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?

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 2012-09-21
    • 2015-11-05
    • 1970-01-01
    • 2015-04-28
    • 2016-04-10
    相关资源
    最近更新 更多