2013-01-21 19 views
11

Moja funkcja validate nie jest uzyskiwanie nazywa się w poniższym kodzie: -Backbone nie uzyskiwanie nazywa

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'); 

proszę zobaczyć skrzypce http://jsfiddle.net/vineet85/Fa8jr/5/

Czy ktoś może mi powiedzieć, dlaczego funkcja validate nie nazywa uzyskiwanie ?

Odpowiedz

33

W Backbone.js validate jest wywoływany automatycznie na save, ale nie na set.

Jeśli chcesz, aby sprawdzanie poprawności działało podczas ustawiania wartości, musisz użyć opcji validate. na przykład

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

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

Impreza error jest wyzwalane, gdy wystąpi błąd, zazwyczaj na serwerze, gdy próbuje zapisać obiekt. Zobacz http://backbonejs.org/#Events-catalog

Jeśli chcesz złapać błędy walidacji spróbować obsługi zdarzeń invalid:

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

Fiddle nadal pracuje .. http://jsfiddle.net/vineet85/Fa8jr/6/ – Vineet

+0

Czego spodziewa się zdarzyć? Myślę, że twoja metoda sprawdzania poprawności jest teraz wywoływana. Jeśli zastanawiasz się, dlaczego nie napisano błędu do konsoli, ponieważ zdarzenie błędu nie jest wyzwalane. Zobacz zaktualizowaną odpowiedź. – Steve

+0

@Vetet, mówiąc, że twoje skrzypce wciąż nie działa, masz na myśli, że komunikat o błędzie ("* kolor musi być jednym z: biały, czerwony, niebieski, żółty *") nie jest drukowany w dzienniku konsoli? Zauważyłem, że w swoim Fiddle nadal używasz zdarzenia * błąd * zamiast * nieważny * jak w odpowiedzi Steve'a. – Tom

0

Wydaje trzeba napisać jakiś dodatkowy kod do uruchomienia validate. jak poniżej: nie

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