Есть ли способ вызвать валидатор Parsley внутри другого? - PullRequest
0 голосов
/ 04 апреля 2019

РЕДАКТИРОВАТЬ:

Я попытался это безуспешно:

window.Parsley.addValidator('date', {
    validateString: function(value, format) {
        if (! value) {
            return true;
        }

        var date = moment(value, format, true);
        return date.isValid();
    },
    priority: 256,
    messages: {
        en: 'It must be a valid date with format %s',
        it: 'Deve essere una data valida nel formato %s'
    }
});

window.Parsley.addValidator('datebeforenow', {
    validateString: function(value, format, parsleyField) {
        console.log("value", value);
        if (! value) {
            return true;
        }

        var $elem = parsleyField.$element;
        $elem.attr(parsleyField.options.namespace + 'date', format);
        $elem.removeAttr(parsleyField.options.namespace + 'datebeforenow');

        $elem.parsley().whenValidate().then(function () {
            $elem.attr(parsleyField.options.namespace + 'datebeforenow', format);
            $elem.parsley().reset();
            var date = moment(value, format, true);
            console.log("date", date);

            return date.isBefore(moment());
        }).always(function () {
            $elem.attr(parsleyField.options.namespace + 'datebeforenow', format);
            console.log("$elem", $elem)
        });
    },
    priority: 255,
    messages: {
        en: "Date must be before now",
        it: "Inserire una data precedente a quella attuale",
    },
});

date сообщение отображается правильно, если вы вводите недопустимую дату, но если вы вводите действительную дату после текущейдата, сообщение не отображается.Я также попытался установить более низкий приоритет на date.


ОРИГИНАЛЬНЫЙ ВОПРОС:

Я создал этот валидатор Петрушки:

window.Parsley.addValidator('date', {
    validateString: function(value, format) {
        if (! value) {
            return true;
        }

        var date = moment(value, format, true);
        return date.isValid();
    },
    priority: 256,
});

и у меня естьэтот другой валидатор:

window.Parsley.addValidator('datebeforenow', {
    validateString: function(value, format) {
        if (! value) {
            return true;
        }

        var valid_date = Parsley._validatorRegistry.validators.date.validateString(value, format);

        if (! valid_date) {
            return true;
        }

        var date = moment(value, format, true);

        return date.isBefore(moment());
    },
    priority: 256,
});

Я надеялся, что Parsley._validatorRegistry.validators.date.validateString(value, format); вызвал другой валидатор, и в поле отобразится сообщение об ошибке date валидатор, поэтому мне не нужно добавлять оба валидатора.Но сообщение об ошибке не появляется.

Как правильно вызвать валидатор внутри другого?

1 Ответ

0 голосов
/ 05 апреля 2019

У Петрушки нет механизма, чтобы иметь зависимости между валидаторами. Считалось, что валидаторы независимы.

Ответ на оригинальный вопрос:

Поскольку вам нужны разные сообщения об ошибках, единственный правильный способ справиться с этой ситуацией с помощью Parsley - активировать разные проверки (в вашем случае и date, и datebeforenow).

Быстрый способ выполнить $('[data-parsley-datebeforenow]').attr('data-parsley-date', '') после генерации ваших форм.

...