繁体   English   中英

JSF中的f:ajax问题,需要双击才能执行

[英]Problem with f:ajax in JSF requiring double clicks to execute

我在几个地方都遇到同样的问题,我感到非常沮丧。

每当我尝试触发ajax事件时,总是需要单击两次,而第一个则什么也不做。

我尝试触发第一次点击,然后手动刷新该网站,但是再次没有任何反应。 始终需要两次单击才能触发该事件。

下面的代码显示了一个使用Composite的简单loginform。 在这里,登录按钮需要单击两次才能触发。

主体

<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>

提前致谢 :)

- - - - - -编辑 - - - - - -

我相信我已经找到了问题的根源,但是我不确定如何解决它或为什么要解决它。

仅在渲染具有“ Rendered ='boolean'”属性的组件后,才会出现需要双击的问题。 甚至更具体地讲,只有在它从“ Rendered = false”变为“ Rendered = true”之后。

如果将render设置为true,则以下代码将按预期工作。

<h:panelGroup rendered="#{renderHandler.loginPanel}" id="loginPanel" layout="block">

不是您要找的答案:而不是使用“ rendered”隐藏您的登录表单,而是使用CSS来隐藏它并使用javascript来显示它。 与不必为了决定显示表单而返回服务器相比,该表单将获得更好的响应时间。 我意识到这可能不适用于您未提及的其他情况。

我相信您(对于我们大多数人)在JSF 2和Facelets之间的交互中处于灰色地带。 当您在ajax或回发期间要求页面在合成中呈现新元素时,您将添加到JSF组件树而不是从头开始构建时将其包含在其中。 这就是为什么在将render设置为true时看到正确行为的原因。

结合在组成部分之间传递参数,我不保证将renderID设置为您首次单击登录时所认为的样子。

您应该能够通过使用h:outputText输出renderID的值来进行确认。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM