是否可以在另一个内部调用Parsley验证器?

时间:2019-04-04 17:33:30

标签: javascript validation parsley.js

编辑:

我尝试了这个但没有成功:

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的优先级设置为较低。


原始问题:

我创建了这个Parsley验证器:

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 :(得分:0)

Parsley没有机制使验证者之间具有依赖性。有人认为验证者是独立的。

原始问题的答案:

由于您需要不同的错误消息,因此使用Parsley处理这种情况的唯一正确方法是激活不同的验证(在您的情况下为datedatebeforenow)。

一种快速的方法可能是在生成表单后执行$('[data-parsley-datebeforenow]').attr('data-parsley-date', '')