Javascript 淘汰自定义计算的验证规则

Javascript 淘汰自定义计算的验证规则,javascript,validation,knockout.js,Javascript,Validation,Knockout.js,我创建了一个自定义函数,如下所示。它在存储数据和更新可观察到的元数据值等时运行良好,但在进行验证时会中断 我正在使用敲除验证,并且已经调试了几个小时,我想我发现了一个事实,验证运行了两次,第二次,我的可观察对象的所有规则都被删除了,所以每次可观察对象都是有效的,因为没有规则。后面的代码复制自以下源代码: 为什么我的自定义函数会使可观察的对象放弃验证规则 我的自定义功能 ko.observable.fn.valueByKey = function (key) { return ko.com

我创建了一个自定义函数,如下所示。它在存储数据和更新可观察到的元数据值等时运行良好,但在进行验证时会中断

我正在使用敲除验证,并且已经调试了几个小时,我想我发现了一个事实,验证运行了两次,第二次,我的可观察对象的所有规则都被删除了,所以每次可观察对象都是有效的,因为没有规则。后面的代码复制自以下源代码:

为什么我的自定义函数会使可观察的对象放弃验证规则

我的自定义功能

ko.observable.fn.valueByKey = function (key) {
    return ko.computed({
        read: function () {
            var md = ko.utils.arrayFirst(ko.unwrap(this), function (item) {
                return item.Key() == key;
            });

            if (md === null) {
                md = new MetaData({ Key: key });
                this.push(md);
            }

            return md.Value();
        },
        write: function (value) {
            var md = ko.utils.arrayFirst(ko.unwrap(this), function (item) {
                return item.Key() == key;
            });

            md.Value(value);
        }
    }, this);
};
运行两次的代码

var h_obsValidationTrigger = ko.computed(function () {
                var obs = observable(),
                    ruleContexts = observable.rules();
                console.log(ruleContexts);
                exports.validateObservable(observable);
                return true;
            });
淘汰验证的另一个重要部分js

addRule: function (observable, rule) {
                observable.extend({ validatable: true });

                //push a Rule Context to the observables local array of Rule Contexts
                observable.rules.push(rule);

                return observable;
            },
更新1:

我想出了一个简单的解决方案,几乎可以奏效

ko.observable.fn.valueByKey = function (key) {
    var md = ko.utils.arrayFirst(ko.unwrap(this), function (item) {
        return item.Key() == key;
    });

    if (md === null) {
        md = new MetaData({ Key: key });
        this.push(md);
    }
    return md.Value;
}

使用此选项时,我会收到元素的验证消息,但我的视图模型上的错误计数不会增加,因此视图模型本身仍然有效,即使我收到验证错误。

你能帮忙吗?下面是我的问题的解决方法:我已将max设置为24,但你们仍然可以用键盘写58,而验证并没有告诉你们为什么要直接在输入上定义最小值和最大值?你指的这个例子是从哪里来的?我用一个工作例子更新了我的小提琴,它使用了一个“正常”的可观察的,而不是一个自定义的,它就像一个符咒一样工作。