Как найти указание на ошибку валидации (required="true") при выполнении команды ajax
У меня есть форма внутри диалога, который я закрываю, нажав на кнопку команды с AJAX,
как это
<h:commandButton value="Add" action="#{myBean.addSomething(false)}"
id="add_something_id" >
<f:ajax render="@form someTable" execute="@form"
onevent="closeAddNewSomethingDialogIfSucceeded"></f:ajax>
</h:commandButton>
и вот код JS для закрытия диалога
function closeAddNewSomethingDialogIfSucceeded(data) {
if(data.status === 'success') {
$("#dialog_id").dialog("close");
}
}
Нет проблем до здесь...
Теперь я изменил некоторые поля формы диалога на required="true"
и теперь я хочу, чтобы предотвратить закрытие диалога я получил ошибки проверки...
Но Аякс data.status
все еще достигает своего success
состояние, и я не могу понять, какие признаки ошибки проверки я могу подключить...
есть идеи?
Благодаря ответу BalusC я сделал следующее:
в JSF добавлено:
<h:panelGroup id="global_flag_validation_failed_render">
<h:outputText id="global_flag_validation_failed" value="true"
rendered="#{facesContext.validationFailed}"/>
</h:panelGroup>
F: AJAX был изменен на
<f:ajax render="@form someTable global_flag_validation_failed_render"
и в js добавили следующую проверку
if(data.status === 'success') {
if($("#global_flag_validation_failed").length === 0){
$("#dialog_id").dialog("close");
}
}
4 ответа
Не специально для required="true"
, но вы можете проверить по #{facesContext.validationFailed}
если проверка не удалась вообще. Если вы объедините это с проверкой, нажата ли соответствующая кнопка#{not empty param[buttonClientId]}
, то вы можете собрать его вместе вrendered
атрибут <h:outputScript>
следующее:
<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}">
<f:ajax execute="@form" render="@form someTable" />
</h:commandButton>
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}">
$("#dialog_id").dialog("close");
</h:outputScript>
(обратите внимание, что вам нужно убедиться, что скрипт также перерисован f:ajax)
Немного хакерский, но с этим не справитьсяonevent
Функция как стандартная реализация JSF не предоставляет никакой информации о состоянии проверки в ответе ajax.
Если вам случится использовать RichFaces, то вы можете просто использовать EL вoncomplete
атрибут<a4j:xxx>
командная кнопка / ссылка. Именно они оцениваются на основе запроса, а не на основе просмотра, как в стандартных JSF и PrimeFaces:
<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $('#dialog_id').dialog('close')" />
Или, если вам случится использовать PrimeFaces, то вы можете воспользоваться тем, что PrimeFaces расширяет ответ ajax дополнительным args.validationFailed
атрибут, который вставляется прямо в область действия JavaScriptoncomplete
атрибут:
<p:commandButton ... oncomplete="if (args && !args.validationFailed) $('#dialog_id').dialog('close')" />
(Обратите внимание, что&
был использован вместо&
, так как &
это специальный символ в XML/XHTML)
Или вы можете использовать PrimeFaces RequestContext
API в методе действия bean-компонента для программного выполнения JavaScript в отображаемом представлении.
RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')");
Никаких условных проверок не требуется, так как метод действия компонента не будет вызван в любом случае, если проверка не удалась.
Я думаю, что вы должны взглянуть на RequestContext PrimeFaces. Это поможет вам запустить клиентский код на стороне сервера.
Две вещи 1) Проверка на наличие ошибки в функции "onevent"
Наверняка у вас есть тег сообщения для обязательного поля?
<h:message id="m-my-field-id" for="my-field-id" errorClass="error-class"/>
Таким образом, вы можете проверить класс ошибок, например
var message = $('#m-my-field-id');
if(message.hasClass('error-class'){
//do this
}
else{
//do that
}
2) DOM не в курсе успеха
Да, я вижу сообщение на странице в Firefox, но jQuery говорит мне, что его там нет.
Я обнаружил, что использование наименьшего возможного времени ожидания достаточно, чтобы это исправить
setTimeout(
function(){
setErrorStyle(source.attr('id'));
},
1
);
@BalusC
в вашем примере кода clientId кнопки не задан в качестве параметра, потому что это AJAX-запрос. Так
not empty param[add.clientId] is always false.
Но это работает:
param['javax.faces.source'] eq add.clientId
(протестировано с помощью jsf-impl-2.2.12.redhat-1)
С уважением