2012-06-07 12 views
8

Estoy tratando de usar knockout validation lib para validar una matriz de objetos. No es sencillo para mí cómo formar un grupo de validación para una serie de observables. La única manera me las arreglé para hacer que funcione es así (JSFIDDLE included):¿Cómo validar una matriz?

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

Parece que mi enfoque es innecesariamente prolijo. De acuerdo con el código fuente que puede simplemente pasar un observable a ko.validation.group:

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

Pero esto no funciona.

Respuesta

14

Hay una opción de configuración para que la agrupación sea profunda (recursiva). Se puede configurar de forma global con ko.validation.init({ grouping: { deep: true } }) o en el group llamada en sí, por ejemplo: self.errors = ko.validation.group(self.notes(), {deep: true});

violín Actualizado aquí: http://jsfiddle.net/KHFn8/4116/

Por cierto, la forma en que lo hizo se podría escribir en forma mucho más corto:

self.errors = ko.validation.group(
    ko.utils.arrayMap(self.notes(), function(note) { return note.name })); 

Editar: Mi violín ya no funciona con la última versión de validación KO. Aquí está el mismo violín utilizando la última versión en el momento en que di la respuesta (junio de 2012): http://jsfiddle.net/KHFn8/4117/

+0

Genial, hombre, ¡ahorraste un día! Solo hay una cosa más. Funciona bien, pero si agrega otra instancia a una matriz más tarde, no se incluye en el grupo. [Echa un vistazo a este violín] (http://jsfiddle.net/KHFn8/340/) – Dziamid

+0

Lo que me gusta de los knockouts es que no tiene magia que se interponga en tu camino. Nuevamente, resolví mi problema. El código es detallado pero funciona: elementos añadidos dinámicamente ahora agregados a la validación. [Fiddle] (http://jsfiddle.net/KHFn8/344/). – Dziamid

+0

-1: este violín no hace ninguna validación. –

2

Tengo poca reputación para comentar. Entonces aquí viene otra respuesta. La respuesta con violines provistos por costuras antideslizantes para que no funcionen más. (El enlace a knockout.js estaba roto, pero incluso después de arreglarlo y agregar un enlace de trabajo para knockout 3.0 todavía no funcionaba)

Añadí ko.computado alrededor del ko.validation.group() y lo obtuve trabajando de esa manera.

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

http://jsfiddle.net/bezFR/17/ (Actualizado)

supongo que hay una mejor manera de hacer esto, pero por ahora se resuelve mi problema, y ​​yo estoy deseando que ser corregido/viendo una mejor solución :)