如何验证数组?

Dzi*_*mid 8 knockout-2.0 knockout.js knockout-validation

我试图使用knockout验证lib来验证一个对象数组.对于如何为可观察数组形成验证组,我并不是直截了当的.我设法使其工作的唯一方法是这样(包括JSFIDDLE):

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());
Run Code Online (Sandbox Code Playgroud)

看起来我的方法不必要地冗长.根据源代码,您只需将一个observable传递给ko.validation.group:

self.errors = ko.validation.group(self.notes());
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

ant*_*hok 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 }));
Run Code Online (Sandbox Code Playgroud)

编辑:我的小提琴不再适用于最新版本的KO验证.在我给出答案的时候(2012年6月)使用最新版本的同一个小提琴:http://jsfiddle.net/KHFn8/4117/

  • @antishok:杰出.Upvoting反映这一点.谢谢. (2认同)