如何验证数组?

时间:2012-06-07 17:07:55

标签: knockout.js knockout-2.0 knockout-validation

我正在尝试使用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());

但这不起作用。

2 个答案:

答案 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/(已更新)

我猜有更好的方法可以做到这一点,但现在它解决了我的问题,我期待得到纠正/看到更好的解决方案:)