I am trying to use knockout validation lib to validate an array of objects. It is not straightforward to me how to form a validation group for an array of observables. The only way I managed to make it work is like this (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());
It seems like my approach is unnecessarily verbose. According to the source code you can simply pass an observable to ko.validation.group:
self.errors = ko.validation.group(self.notes());
But this doesn't work.
There is a configuration option for the grouping to be deep (recursive).
It can be set either globally with ko.validation.init( { grouping: { deep: true } } )
or in the group
call itself, e.g.: self.errors = ko.validation.group( self.notes(), {deep: true} );
Updated fiddle here: http://jsfiddle.net/KHFn8/4116/
BTW, the way you did it could be written in much shorter form:
self.errors = ko.validation.group(
ko.utils.arrayMap(self.notes(), function(note) { return note.name }));
Edit: My fiddle no longer works with the latest version of KO validation. Here is the same fiddle using the latest version at the time I gave the answer (June 2012): http://jsfiddle.net/KHFn8/4117/