0

我在主干 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)
                 }
4

1 回答 1

0

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

  • 继承骨干模型

您可以创建自己的自定义模型,该模型继承自 Backbone 模型。在其中您可以覆盖保存方法。阅读 Backbone 文档,了解如何扩展他们的模型

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

  • 覆盖 Backbone.Sync

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

}

请确保使用此策略,Sync 方法将被您的所有 Backbone 同步覆盖。如果您不希望这样,请使用 Model#save 覆盖。

看看这段代码,我重写了 Backbone.Sync 以使其与 Parse.com API 一起工作。

于 2013-02-24T20:31:12.377 回答