带有ajax的Commandlink仅在第二次单击时起作用

时间:2012-12-05 09:45:09

标签: jsf

我尝试做的只是一个简单的注销功能。主页面将调用模板页面;由标题和内容组成。标题包含注销按钮。页面中将有两个表单,一个在标题中(注销按钮),一个在内容中(几个按钮,链接等)。

我的问题是首次点击退出链接时页面刷新,只在第二次点击后才进行。当我在内容表单中包含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(<p:commandLink>和ajax false ==&gt;这返回到上一页;后备bean中的方法没有运行。

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

1 个答案:

答案 0 :(得分:1)

  

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

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

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

  1. 明确指定<f:ajax render>中所有其他表单的客户端ID。您可以指定多个客户端ID空间分隔。 E.g。

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