インスタンス化中に新しいBackbone.Modelで検証エラーを取得するにはどうすればよいですか?

既存のモデルの「エラー」イベントにバインドするのは簡単ですが、新しいモデルが有効かどうかを判断する最善の方法は何ですか?

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?
5

4 答え

バリデーションロジックは、モデルの validate メソッドを呼び出すことで明示的にトリガできます。しかし、これによって error イベントが引き起こされることはありません。 trigger メソッドを呼び出すと、モデルのエラーイベントを手動でトリガーできます。

目的の動作を達成する1つの方法は、初期化メソッドでイベントを手動でトリガーすることです。

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 '';
  }
});
12
追加された
ありがとう、これはちょうど私が必要なものでした。ときには、バックボーンのドキュメントは細部を整理するのには大したものではありません。
追加された 著者 PetrolMan,

私はこれをテストしていませんが、コレクションのすべてのモデルのすべてのイベントがコレクションに渡され、トリガーされることは間違いありません。コレクションの error イベントを聞くことができるはずです。

var cars = new Cars();
cars.bind('error', function() {
    console.log('Model not valid!')
})
cars.add({'weight': -5});

Edit: Nope, this works for setting properties on existing models, but not on model creation. Ugh - it looks like there's no way to listen for this without overriding some part of the Backbone code. Models don't perform validation when they're initialized:

var car = new Car({weight: -5});
console.log(car.get('weight'));//no error, logs -5

また、 collection.add()は検証を実行しますが、暗黙的に失敗します。

collection.add()の代わりに .create()を使用すると、 .create() > false に失敗しました。しかし、これはサーバー上にモデルを作成しようとしますが、これはあなたが望むものではないかもしれません。

ですから、これを行う唯一の方法は、 collection._prepareModel をオーバーライドしてカスタムイベントをトリガーすることです。

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!'

Example here: http://jsfiddle.net/nrabinowitz/f44qk/1/

1
追加された

私はそれのような問題に遭遇した

私の解決策

...

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

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

...
1
追加された
this.collection.fetch({
    validate: true
});
0
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript