2013-01-21 7 views
11

Meine Validate-Funktion im Code unten nicht genannt zu werden: -Backbone Validate Funktion nicht immer genannt

var Vehicle = Backbone.Model.extend({ 
    color: 'green', 
    validate: function (attrs) { 
     var validColors = ['white', 'red', 'blue', 'yellow']; 
     var colorIsValid = function (attrs) { 
      if (!attrs.color) return true; 
      return _.contains(validColors, attrs.color); 
     } 
     if(!colorIsValid(attrs)) { 
      return "color must be one of: " +validColors.join(","); 
     } 
    } 
}); 

var car = new Vehicle(); 

car.on('error', function (model, error) { 
    console.log(error); 
}); 

console.log(car.get('color')); 
car.set('color', 'muave'); 

Bitte sehen Geige http://jsfiddle.net/vineet85/Fa8jr/5/

Kann mir jemand sagen, warum die Prüf-Funktion nicht aufgerufen zu werden ?

Antwort

33

In Backbone.js wird validate automatisch auf save aber nicht auf set aufgerufen.

Wenn Validierungen beim Einstellen eines Werts ausgeführt werden sollen, müssen Sie die Option validate verwenden. z.B.

car.set('color', 'muave', {validate: true}); 

Siehe http://backbonejs.org/#Model-validate

Das error Ereignis ausgelöst wird, wenn ein Fehler auftritt, in der Regel auf dem Server, wenn das Objekt zu speichern versuchen. Siehe http://backbonejs.org/#Events-catalog

Wenn Sie Prüffehlern Umgang versuchen fangen wollen die invalid Veranstaltung:

car.on('invalid', function (model, error) { 
    console.log(error); 
}); 
+0

Fiddle noch nicht funktioniert .. http://jsfiddle.net/vineet85/Fa8jr/6/ – Vineet

+0

Was erwarten Sie passieren? Ich denke, dass Ihre Validierungsmethode nun aufgerufen wird. Wenn Sie sich fragen, warum kein Fehler in die Konsole geschrieben wird, ist dies so, weil das Fehlerereignis nicht ausgelöst wird. Siehe aktualisierte Antwort. – Steve

+0

@Vineet, indem Sie sagen, dass Ihre Geige immer noch nicht funktioniert, meinst du, dass Fehlermeldung ("* Farbe muss eine der folgenden sein: weiß, rot, blau, gelb *") nicht auf dem Konsolenprotokoll ausgedruckt? Ich habe bemerkt, dass du in deiner Fiddle immer noch event * error * anstelle von * invalid * verwendest, wie in Steves Antwort. – Tom

0

Scheint brauchen etwas mehr Code zu schreiben, für die Validate laufen. wie unten:

car.set('color', 'muave', {validate:true}); 
Verwandte Themen