【发布时间】:2012-11-16 15:22:10
【问题描述】:
我正在尝试试验,看看是否有任何聪明的解决方案来创建自定义验证器,这些验证器可以被抽象出来以实现整洁和重用。
在下面的 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/
【问题讨论】:
标签: knockout.js knockout-validation