敲除验证自定义规则不起作用
Knockout Validation custom rules are not working
我无法使自定义规则起作用。恐怕我无法理解一些基本的东西。在此示例中,b
、bvm
和 berr
都按预期从 required
扩展程序中验证。针对我的自定义扩展器 foo
、a
、avm
和 aerr
不会按预期失败验证。
从 validator
中调用 console.log()
表明验证器没有被触发。我能够触发验证器函数的唯一方法是在 init 之后调用 ko.registerExtenders
(尽管没有理由这样做,默认情况下启用 registerExtenders
。如果它被调用,validator
当我引用创建可观察数组的扩展程序时触发。
ko.validation.init({
grouping: {
deep: true,
live: true,
observable: true
}
});
ko.validation.rules['foo'] = {
validator: function(arr) {
if (!arr.length) {
return false;
} else {
return true;
}
},
message: 'Please foo.'
};
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]);
我认为您需要在注册所有自定义验证规则后初始化验证插件(在注册 foo
验证规则后调用 ko.validation.init
fn)。
我的猜测是,当您初始化插件时,它将使用之前注册的配置和规则,因此不会考虑之后注册的所有自定义规则(除非,如您所指出的,您调用 registerExtenders
,这将强制重新注册所有自定义扩展器)。
另请参阅,对于专门为一个对象注册的自定义规则(请参阅我对您的 fiddle 的修改:https://jsfiddle.net/elbecita/c7xynchp/10/),无论您何时初始化验证插件,它们始终会被考虑在内.
希望对您有所帮助!
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])());
我无法使自定义规则起作用。恐怕我无法理解一些基本的东西。在此示例中,b
、bvm
和 berr
都按预期从 required
扩展程序中验证。针对我的自定义扩展器 foo
、a
、avm
和 aerr
不会按预期失败验证。
从 validator
中调用 console.log()
表明验证器没有被触发。我能够触发验证器函数的唯一方法是在 init 之后调用 ko.registerExtenders
(尽管没有理由这样做,默认情况下启用 registerExtenders
。如果它被调用,validator
当我引用创建可观察数组的扩展程序时触发。
ko.validation.init({
grouping: {
deep: true,
live: true,
observable: true
}
});
ko.validation.rules['foo'] = {
validator: function(arr) {
if (!arr.length) {
return false;
} else {
return true;
}
},
message: 'Please foo.'
};
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]);
我认为您需要在注册所有自定义验证规则后初始化验证插件(在注册 foo
验证规则后调用 ko.validation.init
fn)。
我的猜测是,当您初始化插件时,它将使用之前注册的配置和规则,因此不会考虑之后注册的所有自定义规则(除非,如您所指出的,您调用 registerExtenders
,这将强制重新注册所有自定义扩展器)。
另请参阅,对于专门为一个对象注册的自定义规则(请参阅我对您的 fiddle 的修改:https://jsfiddle.net/elbecita/c7xynchp/10/),无论您何时初始化验证插件,它们始终会被考虑在内.
希望对您有所帮助!
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])());