Удаленная проверка петрушки выполняется несколько раз, даже после успешной отправки - PullRequest
0 голосов
/ 07 мая 2018

Я использую петрушку в своем проекте для проверки формы. Одно поле в указанной форме является идентификатором, который должен быть уникальным - поэтому я добавил свой собственный addAsyncValidator, и в бэкэнд я возвращаю 404 или 200 в зависимости от того, существует ли уже запись с идентификатором.

Когда нажата кнопка отправки формы, я использую

$("#frmobjectadd").submit(function(event){
    $(this).parsley().whenValidate().done(function() {
        //Ajax call to the backend to insert data here...
    }
});

для решения проблем асинхронной проверки. Проверка с использованием этого метода работает, однако я заметил, что почти каждый раз, когда я отправляю форму, по крайней мере три вызова Ajax выполняются только для этого поля. Кроме того, когда форма действительна, данные отправляются на сервер, где они успешно обрабатываются. В журнале XHR я вижу ответ AJax, который указывает, что он был успешным, и в этом случае я перенаправляю пользователя на другую страницу. Несмотря на это, Parsley по-прежнему отправляет запрос на проверку формы удаленному валидатору, который завершается неудачно, поскольку он проверяет, существует ли уже добавленная мной запись в БД. Это приводит к тому, что сообщение об ошибке отображается в течение короткого периода времени, прежде чем произойдет перенаправление. Есть ли способ исправить это?

Удаленный валидатор:

Parsley.addAsyncValidator('objectexists', function (xhr) {
     return xhr.status === 200;
}, "/backend/insert.php?formfunction=checkIfUnique&projectid=<?php echo $projectid; ?>");

Поле, о котором идет речь

<input type="text" required
    data-parsley-remote
    data-parsley-remote-validator="objectexists"
    data-parsley-remote-message="Object name already exists."
    class="form-control" id="id" name="id" value="" placeholder="Type in object name">

Инициализация петрушки для формы выглядит следующим образом:

    $('#frmobjectadd').parsley({
        errorClass: 'has-error',
        classHandler: function(el) {
          return el.$element.closest(".form-group");
        },
        errorsWrapper: '<span class="help-block"></span>',
        errorTemplate: "<span></span>",
        errorsContainer: function(el) {
            return el.$element.closest('.form-group');
        }
    });   

1 Ответ

0 голосов
/ 07 мая 2018

Почему бы не позволить Parsley обработать событие submit, не нужно также вызывать whenValidate. Просто прослушайте form:success или form:submit событие.

...