2012-06-07 3 views
8

Я пытаюсь использовать 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()); 

Похоже, что мой подход является излишне многословным. В соответствии с исходным кодом, вы можете просто передать наблюдаемым в ko.validation.group:

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

Но это не работает.

ответ

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 })); 

Edit: Моя скрипка больше не работает с последней версией проверки КО. Вот такая же скрипка, использующая последнюю версию в то время, когда я дал ответ (июнь 2012): http://jsfiddle.net/KHFn8/4117/

+0

Отлично, человек, вы спаслись за день! Есть еще одна вещь. Он отлично работает, но если вы добавите еще один экземпляр в массив позже, он не будет включен в группу. [Взгляните на эту скрипку] (http://jsfiddle.net/KHFn8/340/) – Dziamid

+0

Что мне нравится в нокауте, так это то, что у него нет магии, которая стоит на вашем пути. Опять же, я решил свою проблему. Код является подробным, но работает - динамически добавленные элементы теперь добавляются к проверке. [Фидл] (http://jsfiddle.net/KHFn8/344/). – Dziamid

+0

-1: Эта скрипка не делает никакой проверки. –

2

У меня недостаточно отзывов, чтобы комментировать. Итак, вот еще один ответ. Ответ с предоставленными скрипками шортами antishok, чтобы больше не работать. (Ссылка на knockout.js была сломана, но даже после ее исправления и добавления рабочей ссылки на нокаут 3.0 она все еще не работала)

Я добавил ko.computed вокруг ko.validation.group() и получил его работая таким образом.

self.errors = 
    ko.computed(function() { 
     return ko.validation.group(self.notes(), { deep: true })}); 

http://jsfiddle.net/bezFR/17/ (Обновлено)

Я предполагаю, что есть лучший способ сделать это, но теперь он решает мою проблему, и я с нетерпением жду, чтобы исправить/видя лучшее решение :)