我没有测试过,但我非常确定集合中所有模型的所有事件也将被传递和触发。因此,您应该能够在集合上侦听error
事件:
var cars = new Cars();
cars.bind('error', function() {
console.log('Model not valid!')
})
cars.add({'weight': -5});
编辑: 不行,这个方法可以用于设置现有模型的属性,但不能在创建模型时使用。唉 - 看起来没有办法在不覆盖Backbone代码的情况下监听此事件。当模型被初始化时,它们不执行验证:
var car = new Car({weight: -5});
console.log(car.get('weight')); // no error, logs -5
虽然collection.add()
执行验证,但它会静默失败。
如果您使用collection.create()
而不是collection.add()
,则可以进行检查,因为.create()
在失败时将返回false
。但是这将尝试在服务器上创建模型,这可能不是您想要的。
因此,我认为唯一的方法是覆盖collection._prepareModel
并触发自定义事件,如下所示:
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});
这里是示例:http://jsfiddle.net/nrabinowitz/f44qk/1/