0

問題

すべての予期しないエラーを処理するデフォルトのエラー ハンドラーをアプリに用意したいのですが、(モデルを保存するときなどに) 予想されるエラーが多数あるため、一般的なエラーを表示するのではなく、カスタムの方法でそれらを処理したいと考えています。エラーページ。

私の以前の解決策

私のBackbone.sync関数はこれを持っていました:

if(options.error)
  options.error(response)
else
  app.vent.trigger('api:error', response) # This is the global event channel

errorただし、バックボーンは常にエラー関数をラップするため、モデルでイベントをトリガーできるため、これは機能しなくなりました。

新しいソリューション 1

fetchモデルとコレクションのandメソッドを上書きしsaveてラップoptions.errorし、上記のコードを含めることもできますが、これはちょっと見苦しいです。

新しいソリューション 2

モデルで聞いてerrorください。ただし、これにより、デフォルトのエラーハンドラーをオーバーライドすることはできません。

新しいソリューション 3

エラーのグローバルトリガーを無効にするカスタムオプションを渡しますが、これは冗長に感じます。


私は何かを逃したことがありますか?これを行うための推奨される方法はありますか?


ホームページの最新バージョンではなく、gitリポジトリの最新バージョンを使用していることを付け加えることができます。

4

1 に答える 1

0

上書きされた同期でこれを行うことができますか? これは、以前と同じことを達成するようです。

// error is the error callback you passed to fetch, save, etc.
var error = options.error;
options.error = function(xhr) {
  if (error) error(model, xhr, options);
  // added line below.
  // no error callback passed into sync.
  else app.vent.trigger('api:error', xhr); 

  model.trigger('error', model, xhr, options);
};

このコードは Backbone ソースからのものelseです。行を追加するだけです。

編集:

これは最も美しい解決策ではありませんが、うまくいくかもしれません。Backbone.Model を拡張する代わりに、使用する新しいモデル基本クラスを作成し、これを拡張します。

var Model = Backbone.Model.extend({

  // override fetch. Do something similar for save, destroy.
  fetch: function(options){
     options = options ? _.clone(options) : {};
     var error = options.error;
     options.error = function(model, resp) {
       if (error) error(model, resp);
       else app.vent.trigger('api:error', resp); 
     };

     return Backbone.Model.prototype.fetch.apply(this, [options]);
  },
});

var MyModel = Model.extend({});
var model = new MyModel();
model.fetch(); // error will trigger 'api:error'

実際、これはsyncとにかくオーバーライドするよりも優れている可能性があります。

考えられる代替手段は、これを使用することです: http://api.jquery.com/ajaxError/。ただし、バックボーンのフェッチ/保存/破棄にエラー コールバックを渡したかどうかに関係なく、エラーが発生します。

于 2013-02-19T19:45:42.087 に答える