1

オブジェクトを作成しました:

var Person = Backbone.Model.extend({
  defaults: {
    'name': '',
    'age': 0
  },
  initialize: function() {
    this.on('error', function(model, error){
      console.log(error);
    });
  },
  validate: function(attributes){
    if (attributes.name == '') {
      return "How do we call him!?";
    }
  },
  changeName: function(name) {
    this.set({'name':name});
  },
  getOlder: function() {
    this.set({'age': this.get('age') +1});
  }   
});

Personのインスタンスを作成し、名前に空白を入れましたが、エラーは発生しませんでした。しかし、すでに作成されているインスタンスに空白の名前を設定すると、検証が実行されました。

var teejay = new Person;
teejay.changeName('');
=> How do we call him!?
teejay.get('name');
=> ""

バックボーンのソースコードから見たものから、

this.set(attributes, {silent: true});

属性が変更または設定されたときにのみ検証が行われると想定するのは正しいですか?

4

1 に答える 1

1

バックボーンは、コンストラクターにハッシュを渡すとき、またはモデルがハッシュを使用してインスタンス化するときを除いて、ユーザーまたは属性のvalidateときに常にメソッドを呼び出します。setsavedefault

例えば

var myperson = new Person({name: ''});

validateコンストラクターはモデルの新しいインスタンスを返さなければならないため、メソッドを呼び出さない。

でも、

var myperson = new Person();
myperson.set('name', '');

意思。

あなたのvalidateメソッドは何も出力しませんreturn-onvalidateはそれが機能したかどうかをテストするために使用されます。何かを返すと、「真実の」検証は失敗しますが、それだけです。'error'メッセージやその他の必要なものをトリガーするのはあなた次第です。

あなたが見ているものは、予想通りです。

TL; DR:defaults有効なモデルを返す必要があるため、ハッシュは検証されません。

(また、Backbone.Validatorプロジェクトに今すぐ参加させてください。自分で作成しないでください!)

于 2012-10-01T17:37:30.650 に答える