Как найти указание на ошибку валидации (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 &amp;&amp; !args.validationFailed) $('#dialog_id').dialog('close')" />

(Обратите внимание, что&amp;был использован вместо&, так как &это специальный символ в 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)

С уважением

Другие вопросы по тегам