javascript - knockout 验证自定义规则不起作用

标签 javascript knockout.js knockout-validation

我无法使自定义规则发挥作用。恐怕我无法理解一些基本的东西。在此示例中,bbvmberr 均按 required 扩展器的预期进行验证。针对我的自定义扩展器 fooaavmaerr 不会按预期失败验证。

validator 中调用 console.log() 表明验证器没有被触发。我能够触发验证器函数的唯一方法是在 init 之后调用 ko.registerExtenders (尽管没有理由这样做,但 registerExtenders 是通过以下方式启用的)默认值。如果调用它,当我引用创建可观察数组的扩展器时,会触发validator

Here's my fiddle.

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]);    

最佳答案

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])());

关于javascript - knockout 验证自定义规则不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37314937/

相关文章:

javascript - 如何在 datepicker JS 中禁用选择上一个日期?

javascript - AWS Cloudwatch 获取警报名称

javascript - Promise 等待解决而不返回

javascript - 如何绑定(bind) CSS background-image 属性?

Javascript 迭代一组属性

javascript - 将 JavaScript 函数作为参数传递

javascript - 根据 Knockout.js 中的复选框绑定(bind) future 的日期选择器最大日期

javascript - 在knockoutjs上自动触发点击事件

javascript - 两个相互依赖的字段的 knockout validation

knockout.js - 自定义错误消息和位置