#ajax #jsf-2
#ajax #jsf-2
Вопрос:
У меня такая же проблема в нескольких местах, и я становлюсь довольно расстроенным.
Всякий раз, когда я пытаюсь запустить событие ajax, для этого всегда требуется два щелчка, первый просто ничего не делает.
Я попытался выполнить первый щелчок, а затем вручную обновить сайт, но опять же, ничего не происходит. Для запуска события всегда требуется два щелчка.
Приведенный ниже код показывает простую форму входа с использованием composite. Здесь для запуска кнопки входа требуется два щелчка.
Основная часть
<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».
Следующий код работает так, как задумано, если для отображения задано значение true.
<h:panelGroup rendered="#{renderHandler.loginPanel}" id="loginPanel" layout="block">
Комментарии:
1. Что-нибудь еще прилагается? Что-нибудь еще мешает коду в браузере? Нравится просто небольшой эффект наведения в javascript или прикрепленном файле .js?
Ответ №1:
Вот ответ, который вы не искали: вместо того, чтобы использовать «rendered», чтобы скрыть вашу форму входа, вместо этого используйте CSS, чтобы скрыть ее, и javascript, чтобы показать ее. Вы получите лучшее время отклика для формы, чем необходимость возвращаться на сервер только для того, чтобы решить показать форму. Я понимаю, что это может не сработать в других ситуациях, о которых вы не упомянули.
Я полагаю, что вы работаете в серой зоне (для большинства из нас) при взаимодействии между JSF 2 и Facelets. Когда вы запрашиваете страницу во время ajax или обратной отправки для отображения нового элемента в композиции, вы добавляете к дереву компонентов JSF, а не являетесь его частью, когда оно было создано с нуля. Вот почему вы видите правильное поведение, когда вы устанавливаете значение rendered в true.
В сочетании с передачей параметров между частями композиции я бы не гарантировал, что renderID установлен на то, что вы думаете, когда вы впервые нажимаете login.
Вы должны иметь возможность подтвердить вывод значения renderID с помощью h:outputText.