0

サーバーがエラーを返した場合に備えて、バックボーンの ajax 成功メソッド内に独自のカスタム エラー コードがあります。問題は、このコードがアプリ全体で繰り返され、成功関数を 1 か所で編集したかったため、ajax の成功ごとにこのエラー ハンドラーを常に繰り返す必要がないことです。成功関数を編集して、このエラー チェック ラッパーを含めたいと考えています。その方法を知っていますか?

以下は、私の見解の 1 つである成功方法の例です。

"success" : function success(model, data)
             {
              if(data['error'] !== undefined && data['error'].length === 0)
               {
                message('error', 'Whoops! System Error. Please refresh your page.');
               }
              else if(data['error'] !== undefined)
               {
                message('error', data['error']);
               }
              else
               {
                //add templates and do stuff here
               }
             },

理想的には、どこかの構成でそれを設定したいと思います。そうすれば、次を使用できるようになります。

"success" : function success(model, data)
             {
              // add templates and do stuff here
             }

これは可能ですか?ajaxSetup を使用してみましたが、うまくいかなかったようです。

更新されたコードがまだ機能しない:

それは私をもう少し先に進めますが、エラーハンドラーはラッパーとして機能していません. データが ajax 呼び出しに渡されていません。実際、私の ajax 呼び出しの成功メソッドはまったく実行されていません。ajax 呼び出しで console.log("some text") を試しましたが、何も出力されません。これの何が悪いのか知っていますか?

// Save the original Sync method
defaultSync = Backbone.sync;

//Over ride Backbone async
Backbone.sync = function(method, 
                         model, 
                         options) 
                 {
                  success = options.success

                  options.success = function(data) 
                                     {
                                      if(data['error'] !== undefined && data['error'].length === 0)
                                       {
                                        message('error', 'Whoops! System Error. Please refresh your page.');
                                       }
                                      else if(data['error'] !== undefined)
                                       {
                                        message('error', data['error']);
                                       }
                                      else
                                       {
                                        success(model, 
                                                data);
                                       }
                                     }

                  return defaultSync(method, 
                                     model, 
                                     options)
                 }
4

1 に答える 1

0

これを解決するには、次の 2 つの方法があります。

  • バックボーン モデルの継承

Backbone Model から継承する独自のカスタム モデルを作成できます。その中で、save メソッドをオーバーライドできます。モデルを拡張する方法についてバックボーンのドキュメントを読む

カスタムの save メソッドでは、super の save メソッドを呼び出し、responseText をチェックします。成功した場合は、success コールバックを呼び出します。(Javascript で親モデルのメソッドを呼び出す方法については、バックボーン ドキュメントをお読みください)

  • Backbone.Sync をオーバーライドする

バックボーンには、基本的にデフォルトですべての ajax リクエストを作成し、応答を解析してから、モデルで保存を呼び出すときに指定した成功/エラー コールバックを呼び出す Sync モジュールがあります。とてもシンプルです。このドキュメントを見てください。繰り返しますが、これをオーバーライドして、Backbone がデフォルトで行っていることを正確に行いますが、受け取った responseText に基づいて成功/エラー コールバックのみを呼び出します。

更新: サンプル コード (警告コードはテストされていません)

//Over ride Backbone async

defaultSync = Backbone.Sync // Save the original Sync method. We'll be needing that.

Backbone.Sync = function(method, model, options) {
   success = options.success
   error = options.error

   options.success = function(model, data, options) {
      if (/% all your custom checks are true */) {
           success (model, data, options);
      }
      else {
         error(model,data,options);
     }
    }

   return defaultSync(method, model, options);

}

この戦略では、すべてのバックボーン同期で同期メソッドがオーバーライドされることを確認してください。それを望まない場合は、Model#save オーバーライドを使用してください。

Parse.com API で動作するように Backbone.Sync をオーバーライドしているこのコードを見てください。

于 2013-02-24T20:31:12.377 に答える