de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
aw crud
aw crud
質問

インスタンス化中に新しい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 2011-10-27T22:11:18+00:00 4
プログラミング
javascript
backbone.js
Ken Browning
28日 10月 2011 в 5:46
2011-10-28T05:46:37+00:00
さらに
ソース
編集
#56793523

バリデーションロジックは、モデルの 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
0
nrabinowitz
27日 10月 2011 в 10:25
2011-10-27T22:25:33+00:00
さらに
ソース
編集
#56793522

私はこれをテストしていませんが、コレクションのすべてのモデルのすべてのイベントがコレクションに渡され、トリガーされることは間違いありません。コレクションの 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
0
Dmitriyff Smile
26日 12月 2012 в 6:13
2012-12-26T06:13:21+00:00
さらに
ソース
編集
#56793524

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

私の解決策

...

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

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

...
1
0
Chazm
4日 3月 2013 в 1:07
2013-03-04T13:07:05+00:00
さらに
ソース
編集
#56793525
this.collection.fetch({
    validate: true
});
0
0
関連コミュニティ 1
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
4 ユーザー
日本人コミュニティのjavascript @react_ja @php_ja @angular_ja @vue_ja
開く telegram
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 6日前
2
Hideo Nakagawa
登録済み 1週間前
3
Sergiy Tytarenko
登録済み 1週間前
4
shoxrux azadov
登録済み 1週間前
5
Koreets Koreytsev
登録済み 1週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属