我正在尝试使用knockout validation lib来验证对象数组。对于如何为可观察数组形成验证组,我并不是直截了当的。我设法使其工作的唯一方法是这样(JSFIDDLE included):
var Note = function () {
var self = this;
self.name = ko.observable().extend({ required: true });
};
var viewModel = function() {
var self = this;
self.notes = ko.observableArray([new Note(), new Note()]);
self.validatedObservables = function() {
var arr = [];
ko.utils.arrayForEach(self.notes(), function(note) {
arr.push(note.name);
});
return arr;
};
self.errors = ko.validation.group(self.validatedObservables());
self.submit = function () {
if (self.errors().length != 0) {
self.errors.showAllMessages();
}
};
};
ko.applyBindings(new viewModel());
似乎我的方法不必要地冗长。根据源代码,您只需将一个observable传递给ko.validation.group:
self.errors = ko.validation.group(self.notes());
但这不起作用。
答案 0 :(得分:14)
分组的配置选项是深度(递归)。
可以使用ko.validation.init( { grouping: { deep: true } } )
全局设置
或在group
电话本身,例如:self.errors = ko.validation.group( self.notes(), {deep: true} );
此处更新了小提琴:http://jsfiddle.net/KHFn8/4116/
顺便说一句,你这样做的方式可以用更短的形式写出来:self.errors = ko.validation.group(
ko.utils.arrayMap(self.notes(), function(note) { return note.name }));
修改强>: 我的小提琴不再适用于最新版本的KO验证。在我给出答案的时候(2012年6月)使用最新版本是同一个小提琴:http://jsfiddle.net/KHFn8/4117/
答案 1 :(得分:2)
我不得不低声评论。所以这是另一个答案。 由antishok接缝提供的小提琴的答案不再适用。 (敲除knockout.js的链接已被破坏,但即使在修复并添加了一个工作链接到淘汰赛3.0之后它仍然无法正常工作)
我在ko.validation.group()周围添加了ko.computed,并以此方式工作。
self.errors =
ko.computed(function() {
return ko.validation.group(self.notes(), { deep: true })});
http://jsfiddle.net/bezFR/17/(已更新)
我猜有更好的方法可以做到这一点,但现在它解决了我的问题,我期待得到纠正/看到更好的解决方案:)