Как найти индикацию ошибки проверки (required = "true" ) при выполнении команды ajax

У меня есть форма внутри диалогового окна, которое я закрываю, нажимая на commandbutton с помощью 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", и теперь я хочу предотвратить закрытие диалога, в котором я получил ошибки проверки...

Но ajax 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");
    }
}

Ответы

Ответ 1

Не специально для 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>

(обратите внимание, что вам нужно убедиться, что script также повторно отображается командой 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, который вводится прямо в область JavaScript атрибута oncomplete:

<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) $('#dialog_id').dialog('close')" />

(обратите внимание, что &amp; используется вместо &, потому что & является специальным символом в XML/XHTML)

Или вы можете использовать API-интерфейс PrimeFaces RequestContext в методе действий bean для программного выполнения JavaScript в визуализированном представлении.

RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')");

Никаких условных проверок не требуется, поскольку метод действия bean не будет вызываться в любом случае, когда проверка не выполнена.

Ответ 2

Я думаю, вам стоит взглянуть на PrimeMaces RequestContext. Это поможет вам инициировать клиентский код на стороне сервера.

Ответ 3

Две вещи 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
);