编辑Backbone Ajax成功方法以添加自定义错误处理

时间:2013-02-24 20:11:12

标签: javascript jquery ajax templates backbone.js

在服务器返回错误的情况下,我在骨干ajax成功方法中有自己的自定义错误代码。问题是这个代码在我的应用程序中重复,我想在一个地方编辑成功函数,所以我不必在每个ajax成功中不断重复这个错误处理程序。我想编辑成功函数以包含此错误检查包装器。你知道怎么做吗?

以下是我的一个观点中的成功方法示例:

"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)
                 }

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题:

  • 继承Backbone模型

您可以创建自己的自定义模型,该模型继承自Backbone Model。在其中,您可以覆盖save方法。 Read Backbone docs on how to extend their model

在你的自定义保存方法中,你将调用super的save方法,检查responseText,如果它成功,那么你将调用成功回调。 (请阅读关于如何在Javascript中调用父模型的方法的骨干文档)

  • 覆盖Backbone.Sync

Backbone有一个Sync模块,它基本上默认生成所有ajax请求,解析响应,然后调用在模型上调用save时指定的成功/错误回调。这很简单。 Take a look at this doc。您可以再次覆盖它,完全按照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);

}

请确保使用此策略,将覆盖所有Backbone同步的Sync方法。如果你不想那样,那就使用Model#save override。

看看this code我在哪里覆盖Backbone.Sync以使其与Parse.com API一起使用。