Проблема с f: ajax в JSF, требующая двойного щелчка для выполнения - PullRequest
2 голосов
/ 11 мая 2011

У меня одна и та же проблема в нескольких местах, и я очень разочарован.

Когда я пытаюсь вызвать событие 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>

Заранее спасибо:)

----------- РЕДАКТИРОВАТЬ -----------

IКажется, я нашел корень проблемы, но я не уверен, как я могу это исправить или почему она там есть.

Проблема с требованием двойного щелчка возникает только после рендеринга компонента с этимАтрибут "Rendered = 'boolean'".Или даже более конкретно, только после перехода от «Rendered = false» к «Rendered = true».

Следующий код работает должным образом, если для Rendered задано значение true.

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

1 Ответ

0 голосов
/ 11 июля 2011

Вот ответ, который вы не искали: вместо того, чтобы использовать «rendered», чтобы скрыть форму входа, вместо этого используйте CSS, чтобы скрыть ее, и javascript, чтобы показать ее. Вы получите лучшее время отклика для формы, чем возвращаться на сервер, чтобы решить показать форму. Я понимаю, что это может не сработать для других ситуаций, о которых вы не упоминали.

Я полагаю, что вы работаете в серой зоне (для большинства из нас) во взаимодействии между JSF 2 и Facelets. Когда вы просите страницу во время ajax или post-back отобразить новый элемент в композиции, вы добавляете его в дерево компонентов JSF, а не становитесь его частью, когда оно было построено с нуля. Вот почему вы видите правильное поведение, когда задаете значение true.

В сочетании с передачей параметров между частями композиции я не гарантирую, что renderID будет таким, какой вы думаете, когда вы впервые нажимаете на кнопку входа в систему.

Вы должны быть в состоянии подтвердить, выводя значение renderID, используя h: outputText.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...