non ho ancora testato questo, ma sono abbastanza sicuro che tutti gli eventi su tutti i modelli di una collezione saranno passati da e innescato dalla collezione pure. Così si dovrebbe essere in grado di ascoltare l'evento error
sulla raccolta:
var cars = new Cars();
cars.bind('error', function() {
console.log('Model not valid!')
})
cars.add({'weight': -5});
Edit: No, questo funziona per l'impostazione delle proprietà su modelli esistenti, ma non sulla creazione di modelli. Ugh: sembra che non ci sia modo di ascoltarlo senza sovrascrivere alcuna parte del codice Backbone. I modelli non eseguono la convalida quando sono inizializzati:
var car = new Car({weight: -5});
console.log(car.get('weight')); // no error, logs -5
E mentre collection.add()
fa eseguire la convalida, non riesce in silenzio.
Se si utilizza invece di collection.create()
collection.add()
, è possibile controllare, in quanto .create()
torneranno false
in caso di fallimento. Ma questo proverà a creare il modello sul server, che potrebbe non essere quello che vuoi.
così, penso che l'unico modo per farlo è quello di ignorare collection._prepareModel
e innescare un evento personalizzato, in questo modo:
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!'
Esempio qui: http://jsfiddle.net/nrabinowitz/f44qk/1/
Grazie , questo era proprio quello di cui avevo bisogno. A volte i documenti Backbone non sono grandi nel dare dettagli ai dettagli. – PetrolMan