JSF + Primefaces:带有ajax的“渲染”组件的问题

时间:2010-09-20 23:28:37

标签: java jsf primefaces

修改
似乎无法使renderedupdate属性一起正常工作。这是我的代码

        <ui:define name="left">
            <h:form>
                <p:commandLink value="Hey"
                actionListener="#{bean.setRenderComment}"
                update="comment"/>
            </h:form>
       </ui:define>
       <ui:define name="right">
            <h:panelGroup id="comment" rendered="#{bean.renderComment}">
                hello
            </h:panelGroup>
       </ui:define>

renderCommentbean内的布尔属性。 setRenderComment基本上切换renderComment这样的状态

this.renderComment = !this.renderComment;

是的,每次点击链接Hey时,我都需要刷新以启用或关闭hello。我该如何修复它,以便我不需要刷新

2 个答案:

答案 0 :(得分:13)

我没有在我的项目中使用Primefaces而是使用Richfaces。所以我并不知道Primefaces如何完成刷新过程。但是,我有一个可以轻松测试的想法。

您的问题可能是由于在HTML页面上找不到要重新呈现的组件(即更新)。如果您的rendered属性等于false,那么带有<SPAN> ID的comment 会集成在生成的HTML页面中。因此,当在客户端收到Ajax请求时,Ajax引擎无法刷新此<SPAN>,因为找不到它。

所以你可以做的就是始终呈现你的panelGroup并将你的rendered属性移动到包含 Hello 消息的嵌套<h:outputText>

以下是我的建议:

<h:panelGroup id="comment">
    <h:outputText value="Hello" rendered="#{bean.renderComment}"/>
</h:panelGroup>

这样,在Ajax调用之后,panelGroup将始终刷新,并且它将包含 Hello 消息,关于bean的renderComment属性的值。 / p>

答案 1 :(得分:1)

由于ID为comment的组件不是表单(UINamingContainer组件)子组件之一,因此您需要在ID前加:以指示JSF扫描“上层”。

这应该做:

<p:commandLink value="Hey"
    actionListener="#{bean.setRenderComment}"
    update=":comment" />