It is easy to bind to the \'error\' event of an existing model, but what is the best way to determine if a new model is valid?
Car = Backbone.Model.extend({
va
I haven't tested this, but I'm pretty sure that all events on all models in a collection will be passed to and triggered by the collection as well. So you should be able to listen to the error
event on the collection:
var cars = new Cars();
cars.bind('error', function() {
console.log('Model not valid!')
})
cars.add({'weight': -5});
Edit: Nope, this works for setting properties on existing models, but not on model creation. Ugh - it looks like there's no way to listen for this without overriding some part of the Backbone code. Models don't perform validation when they're initialized:
var car = new Car({weight: -5});
console.log(car.get('weight')); // no error, logs -5
And while collection.add()
does perform validation, it fails silently.
If you use collection.create()
instead of collection.add()
, you can check, since .create()
will return false
on failure. But this will try to create the model on the server, which might not be what you want.
So, I think the only way to do this is to override collection._prepareModel
and trigger a custom event, like this:
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!'
Example here: http://jsfiddle.net/nrabinowitz/f44qk/1/