【问题标题】:Commandlink with ajax works only on second click [duplicate]带有ajax的Commandlink仅在第二次单击时有效[重复]
【发布时间】:2012-11-23 02:27:58
【问题描述】:

我想要做的只是一个简单的注销功能。主页面会调用模板页面;由标题和内容组成。标题包含注销按钮。页面中会有 2 种形式,一种在标题中(退出按钮),一种在内容中(几个按钮、链接等)。

我的问题是第一次点击注销链接时页面刷新,第二次点击后才继续。当我在内容表单中包含 primefaces 或 ajax 代码时,问题开始出现。当我删除该特定代码时,注销会按预期工作。

主模板templateUser.xhtml中的注销表单:

<h:form id="logout">
    <h:commandLink action="#{tenantController.customLogout(e)}"
        id="logoutBtn" immediate="true" value="Logout" />
</h:form>

支持 bean:

public String customLogout(ActionEvent e) {
    return "login.xhtml";
}

仅供参考:customLogout 方法也包含会话销毁,但我只是将页面重定向放在这里。

在模板客户端中,模板指定为:

<ui:composition template="/templateUser.xhtml">

至于JSF库,目前使用jsf 2.0

我尝试过的解决方案:

  • immediate="true"
  • 为表单和commandLink(模板表单和内容表单)输入id
  • 使用 primefaces (&lt;p:commandLink&gt; with ajax false ==> 此返回到上一页;支持 bean 中的方法未运行。

以下是我在这里尝试过的几个链接:

【问题讨论】:

    标签: jsf


    【解决方案1】:

    当我在内容表单中包含 primefaces 或 ajax 代码时,问题开始出现。当我删除该特定代码时,注销会按预期工作。

    您的问题是由commandButton/commandLink/ajax action/listener method not invoked or input value not updated 中所述的第 7 点引起的。当您使用 &lt;f:ajax&gt; 触发 ajax 请求并执行也涵盖所有其他表单的更新时,所有其他表单将失去其视图状态。这导致第一次提交将始终“什么都不做”,但下一次提交将起作用,这与您的问题症状完全匹配。

    您可以通过以下方式之一解决此问题:

    1. &lt;f:ajax render&gt; 中明确指定所有其他表单的客户端ID。您可以指定多个客户端 ID 以空格分隔。例如

      <f:ajax ... render="someComponent otherComponent :loginForm" />
      
    2. 使用此答案中建议的基于 JavaScript 的修复:h:commandButton/h:commandLink does not work on first click, works only on second click

    【讨论】:

    • 感谢 BalusC 的提示。将尝试解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多