我已经创建了一个自定义函数,如下所示。它在存储数据和更新可观察的 MetaData 值等时可以实现perfekt,但在验证时会中断。
我正在使用Knockout验证并且已经调试了几个小时,我发现我发现的事实是验证运行了两次,第二次,我的observable的所有规则都已经下降,所以每次可观察是有效的,因为没有规则。后面的代码从源代码复制到此处:https://github.com/Knockout-Contrib/Knockout-Validation/blob/master/Dist/knockout.validation.js
为什么我的自定义函数会使observable丢弃验证规则?
我的自定义功能
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;
}
使用它时,我会在元素上获得验证消息,但错误计数不会在我的视图模型上出现,因此即使我收到验证错误,它自身的viewmodel仍然有效。