3

我对这两个命令按钮有疑问:加入和离开。

如果我点击离开,我想隐藏加入,反之亦然。

当我将 ajax 设置为 false 时,没有问题(但所有页面都是刷新的,我认为这不是最佳的)。

但是,当 ajax 属性在特定更新的情况下为 true 时(参见代码中的注释),渲染效果很好,但新按钮似乎变得不活动。如果我点击它,什么也不会发生(看起来是 actionListener 触发器,但视图没有刷新,我必须手动刷新才能看到区别)

谢谢阅读。

<h:form id="formWaitingList" rendered="#{connexion.connected}" >
    <p:commandButton id="Join"  
                    actionListener = "#{connexion.joinWaitingList()}"
                    rendered="#{!connexion.waiting}"
                    ajax="false"
               <!-- ajax="true"
                    update="Join,Leave"-->
                    value="Join"/>

   <p:commandButton id="Leave" 
                    value="Leave"
                    ajax="false"
               <!-- ajax="true"
                    udpate="Join,Leave"-->
                    rendered="#{connexion.waiting}"
                    actionListener ="#{connexion.leaveWaitingList()}" />
</h:form>
4

1 回答 1

5

看来您对 HTML/JavaScript 并不完全熟悉。你知道,JSF 基本上是一个 HTML/JavaScript(/CSS) 代码生成器。Ajax 更新在JavaScript中的工作方式基本上是这样的:

  • 在通过 向 JSF 发送 ajax 请求后XMLHttpRequest,检索一个 XML 响应,其中包含所有需要更新的元素及其客户端 ID。
  • 对于每个要更新的元素,使用document.getElementById(clientId)在当前 HTML DOM 树中找到它。
  • 用 ajax XML 响应中指定的新元素替换该元素。

但是,如果一个 JSF 组件因为 没有生成它的 HTML 表示rendered="false",那么在 HTML DOM 树中就没有任何东西可以被找到和替换。这完全解释了你“看到”的症状。

您基本上需要将有条件呈现的 JSF 组件包装在始终呈现 HTML 表示的组件中,然后在 ajax 更新中引用它。

例如,

<h:form>
    ...

    <h:panelGroup id="buttons">
         <p:commandButton ... update="buttons" rendered="#{condition}" />
         <p:commandButton ... update="buttons" rendered="#{not condition}" />
    </h:panelGroup>
</h:form>

也可以看看:

于 2013-07-07T17:31:33.483 回答