我有一个表单的viewmodel,我正在尝试使用knockout-validation添加验证。
fromDate: ko.observable(
moment().subtract('days', 1).startOf('day').format(dateFormat)
),
toDate: ko.observable(
moment().startOf('day').format(dateFormat)
),
我需要确保起始日期小于到目前为止。我似乎无法获得任何形式的自定义验证器来获取对第二个observable的引用。我需要的是:
toDate: ko.observable(moment().startOf('day').format(dateFormat)).extend({
validation: {
validator: function (val, someOtherVal) {
return moment(val) >= moment(someOtherVal);
},
message: 'Must be greater or equal to From Date',
params: viewModel.fromDate()
}
}),
有什么想法吗?
更新
我确定我已经尝试过了,但是将扩展方法移动到onload函数中会有效。
$(function () {
ko.validation.configure({ decorateElement: true });
viewModel.toDate.extend({
validation: {
validator: function (val, someOtherVal) {
return moment(val) >= moment(viewModel.fromDate());
},
message: 'To date must be greater than from date',
}
});
ko.applyBindings(viewModel);
});
答案 0 :(得分:6)
knockout-validation的核心规则无法将observables作为验证参数处理。但是已经有一个推送请求可以解决这个问题:https://github.com/ericmbarnard/Knockout-Validation/pull/217
因此,您必须使用自定义角色。您应该将param作为函数插入(通过省略括号)。这将使敲除验证能够对参数的变化作出反应。
function ViewModel() {
var self = this; // capture this to be able to reference properties
self.fromDate = ko.observable(
moment().subtract('days', 1).startOf('day').format(dateFormat)
);
self.toDate = ko.observable(
moment().startOf('day').format(dateFormat)
).extend({
validation: {
validator: function (val, someOtherVal) {
return moment(val) >= moment(someOtherVal());
},
message: 'Must be greater or equal to From Date',
params: self.fromDate
}
}),
}
答案 1 :(得分:2)
查看documentation,看起来就像你可以这样做的方式:
ko.validation.rules['greaterThan'] = {
validator: function (val, otherVal) {
return val > otherVal;
},
message: 'The field must be greater than {0}'
};
ko.validation.registerExtenders();
fromDate: ko.observable(
moment().subtract('days', 1).startOf('day').format(dateFormat)
),
toDate: ko.observable(
moment().startOf('day').format(dateFormat)
).extend({ greaterThan: fromDate() });
它未经测试,我不知道你是想传入fromDate()还是fromDate然后在验证器中使用otherVal()。
答案 2 :(得分:0)
派对有点晚了,但是当我谷歌和#34; knockoutjs密码字段匹配"这是最受欢迎的。
我想要一个不使用验证扩展的匹配器,因为我不需要该软件包的所有产品。
我找到了一个整齐的knockoutjs技巧,用于使用扩展器检查两个或多个字段。也就是说,将原始字段订阅到扩展器中的第二个字段,以便在更新原始字段时针对第二个字段触发valueHasMutated()。
ko.extenders.match = function(target, match_original) {
target.match_ok = ko.observable();
function copy(value) {
target.match_ok(value == match_original());
}
function original(value) {
target.valueHasMutated();
}
copy(target());
target.subscribe(copy);
match_original.subscribe(original);
return target;
};
这是一个更好地说明功能的jsfiddle https://jsfiddle.net/8nugva9f/13/
HTH
答案 3 :(得分:-1)
this.fromDate= ko.observable(null).extend({
date: true,
});
this.toDate = ko.observable(null).extend({
date: true,
min: this.fromDate,
});
试试这个。