2012-03-09 9 views
5

¿Hay alguna manera de suprimir la validación del modelo en Backbone.js cuando se crea un nuevo modelo por primera vez?Impedir que el modelo Backbone.js se valide cuando se agrega por primera vez a la colección

En mi aplicación, tengo una colección con un número arbitrario de modelos, que se representan como elementos de la lista. El usuario puede hacer clic en un botón en cada elemento, que inserta un nuevo elemento vacío debajo del elemento actual. El elemento vacío está fallando la validación, obviamente, porque no quiero que un artículo vacío se guarde más tarde.

No tengo forma de saber qué valores predeterminados razonables podrían existir cuando estoy creando el nuevo elemento, por lo que llenar el nuevo modelo con datos válidos no parece una opción.

¿Alguna sugerencia?

Actualización: Mientras trabajaba en un problema relacionado tangencialmente, me di cuenta de que estaba usando la versión 0.9.0 de Backbone.js. Cuando se lanzó esta versión, otras personas tenían el mismo problema que yo y se quejaron en this issue en GitHub.

Jeremy ha modificado la validación en 0.9.1 para solucionarlo. Agregar un modelo (temporalmente) vacío a una colección es un uso válido en el mundo real. Podría manejar el nuevo modelo vacío en la vista, pero si está administrando una lista de elementos como yo, eso lo obliga a tener una colección de vistas de artículos (incluida la vacía) además de su colección de artículos imprescindibles. ser modelos válidos. Esa es una solución realmente torpe para un escenario que de otro modo sería sencillo. Me alegro de que esto se solucionó.

Respuesta

3

No se supone añadir modelos válidos :)

excavar un poco en el código fuente Backbone (0.9.1 al menos) demostraron que el mecanismo puede ser eludido por pasar opciones a su método add:

var Mod=Backbone.Model.extend({ 
    validate: function(attrs,opts) { 
     if (opts.init) return; 
     return "invalid"; 
    } 
}); 

var Col=Backbone.Collection.extend({ 
    model:Mod 
}); 

var c=new Col(); 
c.add({},{init:true}); 

console.log(c.length); 

un violín: http://jsfiddle.net/jZeYB/

Advertencia: se puede romper cosas abajo de la línea.

+0

No agregar modelos no válidos tiene sentido en teoría, pero no puedo pensar en una mejor manera de permitir que el usuario agregue una nueva fila. Supongo que podría manejar todo esto en la vista, luego agregar el elemento a la colección cuando sea válido, pero eso complicaría en gran medida otros aspectos de esta aplicación. Su ejemplo funciona muy bien, pero cuando lo intento en mi aplicación, el parámetro 'options' se sobrescribe con el objeto' {silent: true} ', que Backbone.js parece calzar automáticamente. Estoy muy desconcertado en este momento. –

+0

No debe agregar modelos no válidos: la vista debe capturar el mensaje de error enviado por la validación en el modelo y dejar que el usuario corrija su entrada o cancelarla. Cuando estoy sacando cosas de nuestro servidor y obtengo datos no válidos, simplemente lo dejo caer al piso (y le envío un mensaje a nuestra instalación de registro de Ajax) porque los modelos no válidos en una colección son una 'mala idea' – tkone

2

¿Necesita añadir el modelo a la colección de inmediato? Supongo que la validación falla porque la agrega a la colección inmediatamente.

En cambio, cuando se presiona el botón, puede crear la vista y el modelo en blanco. Cuando el modelo lo valida, lo agrega a la colección. Necesitará un botón/mecanismo de envío en la nueva fila para agregarlo a la colección (que invoca la validación automáticamente).

+0

Voy a dale una oportunidad. Probablemente podría agregar el elemento en el controlador 'change' del modelo, lo que eliminaría la necesidad de un botón de envío. Se agregaría cuando el campo pierda enfoque. ¡Gracias! –

Cuestiones relacionadas