2011-10-27 8 views
5

Es fácil vincularse al evento 'error' de un modelo existente, pero ¿cuál es la mejor manera de determinar si un nuevo modelo es válido?¿Cómo puedo capturar errores de validación en un nuevo Backbone.Model durante la creación de instancias?

Car = Backbone.Model.extend({ 
    validate: function(attributes) { 
    if(attributes.weight == null || attributes.weight <=0) { 
     return 'Weight must be a non-negative integer'; 
    } 
    return ''; 
    } 
}); 

Cars = Backbone.Collection.extend({ 
    model: Car 
}); 

var cars = new Cars(); 
cars.add({'weight': -5}); //Invalid model. How do I capture the error from the validate function? 

Respuesta

12

lógica de validación puede ser activado de forma explícita llamando el método validate de su modelo. Sin embargo, esto no provocará que se desencadene un evento error. Puede desencadenar un evento de error manualmente para un modelo llamando al método trigger.

Una forma de lograr su comportamiento deseado es para activar manualmente el evento en su método de inicialización:

Car = Backbone.Model.extend({ 
    initialize: function() { 
    Backbone.Model.prototype.initialize.apply(this, arguments); 
    var error = this.validate(this.attributes); 
    if (error) { 
     this.trigger('error', this, error); 
    } 
    }, 
    validate: function(attributes) { 
    if(attributes.weight == null || attributes.weight <=0) { 
     return 'Weight must be a non-negative integer'; 
    } 
    return ''; 
    } 
}); 
+2

Gracias , esto era justo lo que necesitaba. A veces, los documentos de Backbone no son excelentes para dar cuerpo a los detalles. – PetrolMan

1

no he probado esto, pero estoy bastante seguro de que todos los eventos en todos los modelos en una colección serán pasados ​​a y activados por la recaudación también. Por lo que debe ser capaz de detectar el evento error en la colección:

var cars = new Cars(); 
cars.bind('error', function() { 
    console.log('Model not valid!') 
}) 
cars.add({'weight': -5}); 

Editar: No, esto funciona para establecer las propiedades de los modelos existentes, pero no en la creación del modelo. Ugh, parece que no hay forma de escuchar esto sin anular una parte del código Backbone. Modelos no llevan a cabo la validación cuando se inicializan:

var car = new Car({weight: -5}); 
console.log(car.get('weight')); // no error, logs -5 

Y mientras lo hace collection.add() realizar la validación, se produce un error en silencio.

Si utiliza collection.create() en lugar de collection.add(), se puede comprobar, ya que .create() regresará false en caso de fallo. Pero esto intentará crear el modelo en el servidor, que podría no ser lo que usted desea.

Por lo tanto, creo que la única manera de hacer esto es para anular collection._prepareModel y desencadenar un evento personalizado, así:

Cars = Backbone.Collection.extend({ 
    model: Car, 
    _prepareModel: function(model, options) { 
     model = Backbone.Collection.prototype._prepareModel.call(this, model, options); 
     if (!model) this.trigger('error:validation'); 
     return model; 
    } 
}); 

var cars = new Cars(); 
cars.bind('error:validation', function() { 
    console.log('Model not valid!') 
}); 
cars.add({'weight': -5}); // logs: 'Model not valid!' 

Ejemplo aquí: http://jsfiddle.net/nrabinowitz/f44qk/1/

1

me encontré problema como se

mi solución

... 

var handler = function(model, error, context) {} 

try { 
    cars.add({}, { error: handler }) 
} catch (e) { }   

... 
0
this.collection.fetch({ 
    validate: true 
}); 
Cuestiones relacionadas