我在一些地方遇到同样的问题而且我很沮丧。
每当我尝试触发ajax事件时,它总是需要两次点击,第一次就是什么都不做。
我尝试触发第一次点击,然后手动刷新网站但又没有任何反应。它总是需要两次点击才能触发事件。
以下代码显示了使用复合的简单登录表单。登录按钮需要点击两次才能触发。
主体
<body>
<h:outputScript library="js" name="topMenuJS.js" />
<div class="topMenu">
<f:ajax execute="pageNavForm" render=":currentMainContent">
<h:form id="pageNavForm">
<h:commandLink styleClass="selector" rendered="#{viewErrandsBean.userID.name != null}" action="#{renderHandler.showCreateIssue()}" value="Create errand" />
<h:commandLink styleClass="selector" rendered="#{viewErrandsBean.userID.name != null}" action="#{renderHandler.showIssue()}" value="View errand" />
<h:commandLink styleClass="selector" rendered="#{viewErrandsBean.userID.admin}" action="#{renderHandler.showCreateUser()}" value="Create user" />
<h:commandLink styleClass="lastSelector" action="#{renderHandler.showLogin()}" value="Login" />
</h:form>
</f:ajax>
<div style="clear:both;" />
</div>
<h:panelGroup layout="block" id="currentMainContent">
<h:panelGroup rendered="#{renderHandler.loginPanel}" id="loginPanel"
layout="block">
<ui:include src="/content/login/login.xhtml">
<ui:param name="renderID" value=":pageNavForm" />
</ui:include>
</h:panelGroup>
</h:panelGroup>
</body>
并且login.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:composition>
<h:outputStylesheet library="css" name="loginPageCSS.css" />
<h:panelGroup class="centerBox">
<h:form>
<table>
<tr>
<td>Username</td>
<td><h:inputText value="#{viewErrandsBean.loginName}" /></td>
</tr>
<tr>
<td>Password</td>
<td><h:inputSecret value="#{viewErrandsBean.loginPass}" /></td>
</tr>
<tr>
<td>
<h:commandButton value="Login" action="#{viewErrandsBean.authenticateUser()}" >
<f:ajax execute="@form" render="#{renderID}" />
</h:commandButton>
</td>
</tr>
</table>
</h:form>
</h:panelGroup>
</ui:composition>
</html>
提前致谢:)
----------- ----------- EDIT
我相信我找到了问题的根源,但我不确定如何解决它或为什么会存在。
在渲染具有“Rendered ='boolean'”属性的组件后,需要双击的问题才出现。或者甚至更具体,只有在它从“Rendered = false”变为“Rendered = true”之后。
如果渲染设置为true,则以下代码按预期工作。
<h:panelGroup rendered="#{renderHandler.loginPanel}" id="loginPanel" layout="block">
答案 0 :(得分:0)
以下是您不寻找的答案:而不是使用“呈现”来隐藏您的登录表单,而是使用CSS来隐藏它和javascript来显示它。您将获得更好的表单响应时间,而不是仅仅为了决定显示表单而返回服务器。我意识到这可能对你没有提到的其他情况不起作用。
我相信你在JSF 2和Facelets之间的交互中处于灰色区域(我们大多数人)。当您在ajax或post-back期间询问页面以在合成中呈现新元素时,您将添加到JSF组件树而不是从头开始构建它时的一部分。这就是为什么当你将渲染设置为true时看到正确的行为。
结合在合成的各个部分之间传递参数,我不保证将renderID设置为您第一次单击登录时的想法。
您应该能够通过使用h:outputText输出renderID的值来确认。