8

我正在尝试使用淘汰赛验证库来验证对象数组。对我来说,如何为一组可观察对象形成一个验证组并不简单。我设法使它工作的唯一方法是这样的(包括 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());

看来我的方法是不必要的冗长。根据源代码,您可以简单地将 observable 传递给 ko.validation.group:

self.errors = ko.validation.group(self.notes());

但这不起作用。

4

2 回答 2

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/

于 2012-06-07T19:27:43.947 回答
2

我必须低声誉才能发表评论。所以这里有另一个答案。由 antishok seams 提供的小提琴的答案不再起作用。(到 knockout.js 的链接已损坏,但即使在修复该问题并添加了一个到 knockout 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/(更新)

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

于 2013-11-05T13:44:58.750 回答