2012-01-18 19 views
5

He encontrado un comportamiento extraño de la validación del modelo en Backbone.js.Validación del modelo de red troncal

Cuando se crea un modelo de primera, como

var foo = new Foo({ 
    bar: 42 
}); 

Backbone invoca foo.set() pasando como un parámetro el mapa dado {bar: 42}, como se puede ver en la source. Al hacerlo, también pasa las opciones {silent: true}, como en la línea

this.set(attributes, {silent : true}); 

Esto tiene sentido, ya que el tener silent === true evita la activación de las change eventos, que no tienen sentido en este contexto.

Por alguna razón, no puedo entender, sin embargo, silent === true también impide la validación; ver la fuente en la línea de

if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; 

Por lo que parece modelo son Nunca validado cuando se crean, pero por lo general son cuando se cambian algunos atributos. Además, la presencia de la validación está inextricablemente ligada a la acción de enviar eventos change, que es algo completamente ortogonal.

¿Alguien puede explicar por qué esto es así? ¿Cuál sería una forma limpia y a prueba de futuro para solucionar este problema?

que podría llamar manualmente _performValidation, pero esto tiene dos inconvenientes:

  • primer lugar, es algo que sólo podía olvidar
  • en segundo lugar, _performValidation no es parte de la API y tal vez va a cambiar en lanzamientos futuros.

Respuesta

3

De hecho, creo que es un error en Backbone.JS.

Hay un tema abierto en GitHub aquí: https://github.com/documentcloud/backbone/issues/870

Editar: En la nueva versión 0.9.1 de Backbone.js, puede probar si el modelo es válido con isValid método (http://backbonejs.org/#Model-isValid)

+0

Ok, gracias, pensé que me faltaba algo – Andrea

+1

Actualización de la versión 0.9.9: La validación ahora ocurre incluso durante cambios "silenciosos".Este cambio significa que el método isValid ha sido eliminado. Las validaciones fallidas también desencadenan un error, incluso si se especifica una devolución de llamada de error en las opciones. – romanlv

0

a partir de ahora la única forma de mantenerse a salvo es nunca pasar los parámetros hash.

siempre lo hago:

var m = new MyModel(); 
// and then I do all the sets 
m.set(...); 
m.set(...); 
m.set(...); 

En caso de que algunos datos JSON proviene de la base de datos, entonces se supone que ya han sido y así validado en ese caso que está bien:

var m = MyMOdel(hashFromDB); 

¿Tiene sentido?

Cuestiones relacionadas