Jsf 使用ajax的Commandlink仅在第二次单击时才起作用

Jsf 使用ajax的Commandlink仅在第二次单击时才起作用,jsf,Jsf,我想做的只是一个简单的注销功能。主页面将调用模板页面;由标题和内容组成。标题包含注销按钮。页面中将有两个表单,一个在页眉(注销按钮),一个在内容中(少数按钮、链接等) 我的问题是当第一次单击注销链接时页面刷新,并且只在第二次单击后继续。当我在内容表单中包含primefaces或ajax代码时,问题开始出现。当我删除该特定代码时,注销将按预期工作 主模板templateUser.xhtml中的注销表单: <h:form id="logout"> <h:commandLin

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

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

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

<h:form id="logout">
    <h:commandLink action="#{tenantController.customLogout(e)}"
        id="logoutBtn" immediate="true" value="Logout" />
</h:form>
仅供参考:customLogout方法也包括会话销毁,但我只是将页面重定向放在这里

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

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

至于JSF库,目前使用的是JSF2.0

我尝试过的解决方案:

  • immediate=“true”
  • 为表单和commandLink(模板表单和内容表单)放置
    id
  • 将primefaces(
    与ajax false==>一起使用,这将返回到上一页;backed bean中的方法未运行
下面是我在这里尝试的几个链接:

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

您的问题是由第7点引起的,如中所述。当您使用
发出ajax请求并执行更新(该更新也涵盖了所有其他表单),则所有其他表单都将丢失其视图状态。这导致第一次提交将始终“不做任何事情”,但下一次提交将起作用,这与您的问题症状完全匹配

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

  • 中明确指定所有其他表单的客户端ID。您可以指定多个以空格分隔的客户端ID。例如

    <f:ajax ... render="someComponent otherComponent :loginForm" />
    
    
    
  • 使用此答案中建议的基于JavaScript的修复程序:


  • 谢谢你的提示,巴卢斯克。我将尝试解决方案。
    <f:ajax ... render="someComponent otherComponent :loginForm" />