2011-10-27 7 views
5

È facile associare l'evento "errore" di un modello esistente, ma qual è il modo migliore per determinare se un nuovo modello è valido?Come posso acquisire errori di convalida in un nuovo Backbone.Model durante l'istanziazione?

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? 

risposta

12

convalida logica può essere attivato in modo esplicito chiamando il metodo validate del tuo modello. Tuttavia, ciò non provocherà l'attivazione di un evento error. È possibile attivare manualmente un evento di errore per un modello chiamando il metodo trigger.

Un modo per raggiungere il vostro comportamento desiderato è quello di attivare manualmente l'evento nel metodo di inizializzazione:

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

Grazie , questo era proprio quello di cui avevo bisogno. A volte i documenti Backbone non sono grandi nel dare dettagli ai dettagli. – PetrolMan

1

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/

1

ho incontrato problema simile

mia soluzione

... 

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

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

... 
0
this.collection.fetch({ 
    validate: true 
}); 
Problemi correlati