Как найти указание на ошибку валидации (обязательно = "true") при выполнении команды ajax - PullRequest
32 голосов
/ 08 марта 2012

У меня есть форма внутри диалогового окна, которую я закрываю, нажимая на кнопку команды с 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");
    }
}

Ответы [ 4 ]

55 голосов
/ 08 марта 2012

Не специально для 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, который вставляется прямо в область 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')");

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

2 голосов
/ 09 мая 2013

две вещи 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
);
2 голосов
/ 08 марта 2012

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

0 голосов
/ 11 октября 2018

@ 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)

regards

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