我正在尝试验证孩子年龄的条目。有效值为'< 1'和1-29。
为此,我正在尝试创建如下的自定义验证器。
我假设这些验证器按顺序工作,所以我一直在移动它们。
用例我正在测试:
我无法完成所有这些测试。 #5失败了。
var ChildModel = function(cookieAge){
var self = this,
age = cookieAge || "";
self.age = ko.observable(age).extend({
validation: [{
validator: function (val) {
return val !== "" || parseInt(val,10) === 0;
},
message: 'Please say how old this child is.'
},{
validator: function (val, someOtherVal) {
return val=== "<1" || val <= someOtherVal;
},
message: "This child's age must be less than or equal to 29.",
params: 29
},{
validator: function (val) {
var text = val.match(/(\D+)/g);
log(text);
return val.match(/^[0-9].$/) || text && text.length > 0;
},
message: "(contains text) For Children less than 1, please use '<1'"
}]
});
};
答案 0 :(得分:3)
我发现将两个验证规则合并为一个有助于缓解一些复杂问题。如果提供的值是数字,则组合的验证规则会短路并返回true,这样就不会无意中尝试检查值是否与'&lt; 1'匹配。
我还利用了isEmptyVal实用程序方法来帮助检测值是否为空。我尝试使用validation:
旁边的一些内置验证规则,但发现它们不起作用,我想这有一些限制。
validation: [{
validator: function (val) {
return !ko.validation.utils.isEmptyVal(val) && parseInt(val,10) !== 0;
},
message: 'Please say how old this child is.'
},{
validator: function (val, someOtherVal) {
if (!isNaN(val)) {
if (val > someOtherVal) {
this.message = "This child's age must be less than or equal to 29.";
return false;
}
return true;
}
if (val !== '<1') {
this.message = "(contains text) For Children less than 1, please use '<1'";
return false;
}
return true;
},
params: 29
}]