【问题标题】:Is it there a way to call a Parsley validator inside another one?有没有办法在另一个内部调用 Parsley 验证器?
【发布时间】:2019-04-04 17:33:29
【问题描述】:

编辑:

我试过这个没有成功:

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 验证器的错误消息,所以我不需要添加两个验证器。但是没有出现错误信息。

在另一个验证器中调用验证器的正确方法是什么?

【问题讨论】:

    标签: javascript validation parsley.js


    【解决方案1】:

    Parsley 没有在验证器之间建立依赖关系的机制。人们认为验证者是独立的。

    回答原问题:

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

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

    【讨论】:

    • 我想在 parsley.js 本身中将这个验证器添加为extra,所以我不能按照你的建议做。见github.com/guillaumepotier/Parsley.js/pull/1296/…
    • 我知道。我不明白你的意思,也不明白为什么你不能按照我的建议去做,抱歉。
    • 因为我希望它作为验证器的默认值。您建议的代码必须由在自己的代码中使用我的extra 验证器的开发人员添加。相反,我希望验证器 datebeforenow 和另一个调用 date 而不需要任何开发人员额外代码。
    猜你喜欢
    • 2012-03-17
    • 2022-11-20
    • 2010-10-23
    • 1970-01-01
    • 2019-09-02
    • 2021-08-15
    • 2011-11-25
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多