Knockout Validation自定义规则无效

时间:2016-05-19 05:56:44

标签: javascript knockout.js knockout-validation

我无法获得自定义规则。我害怕我没有理解一些基本的东西。在此示例中,bbvmberr都已根据required扩展程序的预期验证。根据我的自定义扩展程序fooaavmaerr不会按预期验证失败。

console.log()内调用validator表明验证者未被解雇。我能够获取验证器函数的唯一方法是在init之后调用ko.registerExtenders(尽管没有理由这样做,默认情况下启用registerExtenders。如果调用它,{当我引用创建可观察数组的扩展器时触发{1}}。

Here's my fiddle.

validator

2 个答案:

答案 0 :(得分:1)

init的放置并不像在自定义扩展器之后调用registerExtenders那样重要。如果省略该行,则会忽略自定义扩展器,正如您所经历的那样。

https://jsfiddle.net/c7xynchp/12/

var log = console.debug.bind(console, '[Debug]');
ko.validation.rules['foo'] = {
    validator: function(arr) {
        log('validator', arguments);
        if (!arr.length) {
            log('invalid');
            return false;
        } else {
            log('valid', arr);
            return true;
        }
    },
    message: 'Please select at least one vendor.'
};
ko.validation.registerExtenders();
var a = ko.observableArray().extend({ foo: true });
var avm = ko.validatedObservable({
    a: a
});
var aerr = ko.validation.group([a]);

var b = ko.observableArray().extend({ required: true });
var bvm = ko.validatedObservable({
    b: b
});
var berr = ko.validation.group([b]);
ko.validation.init({
    grouping: {
        deep: true,
        live: true,
        observable: true
    }
});

log('a', a.isValid());
log('avm', avm.isValid());
log('aerr', aerr());
log('b', b.isValid());
log('bvm', bvm.isValid());
log('berr', berr());

// just for laughs
log('aberr', ko.validation.group([a,b])());

答案 1 :(得分:0)

我认为您需要在注册所有自定义验证规则后初始化验证插件(在注册ko.validation.init验证规则后调用foo fn。)

我的猜测是,当您初始化插件时,它将使用之前注册的配置和规则,因此不会考虑之后注册的所有自定义规则(除非,正如您所指出的,您调用{{1这将强制再次注册所有自定义扩展器。)

另请注意,对于专门为一个对象注册的自定义规则(请参阅我对您的小提琴的修改:https://jsfiddle.net/elbecita/c7xynchp/10/),无论何时初始化验证插件,都会始终考虑它们。

希望它有所帮助!