我正在尝试尝试,看看是否有任何聪明的解决方案来创建自定义验证器,这些验证器可以被抽象出来以实现整洁和重用。
在下面的 jsfiddle 中,我只是将一个简单的父模型放在一起,该模型存储和测量数组(只是一个值和一个日期)。在这个例子中,我提出了两个要求。
- 每个测量要么提供两个字段,要么都必须提供。
父数组中必须至少有一个有效(满足先前条件)测量。
理想情况下,我希望将定义有效的验证逻辑存储在 Measurement 对象中,如下所示。但是,我非常讨厌的是我必须在
atLeastOne()
.
剔除验证将自动验证数字和日期的各个字段但是,我必须介入并针对数组的规则执行验证。
问题:是否有任何方法允许我设置 KO 验证以检查数组是否符合要求,同时仍然让HasValues
方法仍然驻留在测量模型中?即我想将搜索“至少一个”的概念抽象为某种可以为我处理工作的自定义验证器,然后告诉这个验证器“嘿,这是我希望你用来验证的函数数组中的每一项。”
提前致谢!
function Model(data)
{
var self = this;
self.Measurements = ko.observableArray();
for(var i = 0; i < data.length; i++)
self.Measurements.push(new Measurement(data[i]));
function hasAtLeastOne(){
var atLeastOne = false;
$.each(self.Measurements(), function(i, item) {
if (item.HasValues()) {
atLeastOne = true;
return;
}
});
return atLeastOne;
}
self.Save = function() {
if (self.canSave() && atLeastOne())
alert('save');
else
alert('arg!');
};
self.errors = ko.validation.group(self);
self.canSave = ko.computed(function() {
return self.errors().length == 0;
});
}
function Measurement(data)
{
var self = this;
self.Value = ko.observable(data.val);
self.Date = ko.observable(data.date);
self.Value.extend({ required: { onlyIf: isRequired }, number: true });
self.Date.extend({ required: { onlyIf: isRequired }, date: true });
self.HasValues = function() {
return ko.utils.isNotNullUndefOrEmpty(self.Value()) &&
self.Date() && self.Date().length > 0;
};
function isRequired() {
return ko.utils.isNotNullUndefOrEmpty(self.Value()) ||
(self.Date() && self.Date().length > 0);
}
}
ko.utils.isNotNullUndefOrEmpty = function (value) {
return (typeof value === 'string' && value.length > 0) ||
(typeof value !== 'string' && value);
};
这是一个 jsfiddle 玩,有我的例子:http: //jsfiddle.net/cACZ9/