2013-01-21 11 views
11

私の検証機能は、以下のコードで呼ばなっていないと呼ばれ得ていない: -バックボーン検証機能

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

フィドル http://jsfiddle.net/vineet85/Fa8jr/5/

検証関数が呼び出さ取得されていない理由を誰かが私に言うことができますを参照してください。 ?

答えて

33

In validateは、saveでは自動的に呼び出されますが、setでは呼び出されません。

値の設定時に検証を実行する場合は、validateオプションを使用する必要があります。例えば

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

は、エラーが発生したときにオブジェクトを保存しようとしたときerrorイベントは、通常、サーバー上で、トリガされhttp://backbonejs.org/#Model-validate

を参照してください。あなたは検証の失敗がinvalidイベントを処理しようとキャッチしたい場合はhttp://backbonejs.org/#Events-catalog

参照してください:

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

フィドルはまだあなたが起こることを期待している何.. http://jsfiddle.net/vineet85/Fa8jr/6/ – Vineet

+0

動作していませんか?私はあなたのvalidateメソッドが呼び出されると思います。エラーイベントがトリガーされていないため、コンソールにエラーが書き込まれていない理由が不思議です。更新された回答をご覧ください。 – Steve

+0

@Vineet、あなたのフィドルがまだ動作しないと言って、エラーメッセージ( "*色は白、赤、青、黄*のいずれかでなければなりません)はコンソールログに出力されません。私はあなたのフィドルで、スティーブの答えのように* invalid *の代わりにevent * error *を使用していることに気付きました。 – Tom

0

は、検証を実行するためのいくつかの余分なコードを記述する必要がありそうです。 以下のように:

car.set('color', 'muave', {validate:true}); 
関連する問題