如何在Backbone fetch调用中调用ajax之后调用“.done”

时间:2015-06-08 01:29:05

标签: backbone.js override fetch

当出现错误服务器端时,我调用的RESTful API不会抛出错误而是返回200成功,并将“fault”对象作为返回数据的一部分。我无法更改API。为了处理这个问题(没有Backbone),所有ajax调用都包含在一个类中,该类在ajax调用之后调用“.done”来处理可能包含在响应中的任何“错误”的显示。此外,一些呼叫者需要能够指定指示故障应显示位置的设置,而其他呼叫者则需要依赖默认位置。

我想更改代码以使用Backbone的同步功能来保存和检索我的模型和集合,但我不确定如何注入所需的设置值和.done函数。我可以覆盖原型同步方法并将其更改为调用我们的自定义ajax方法,但它是一个非常复杂的函数,我更害怕我会破坏某些东西。我更愿意在ajax调用的结果上找到一些更轻松的方式来调用“.done”,但是我很难搞清楚如何。

我看到如何通过覆盖Backbone.Model.prototype.fetch和Backbone.Collection.prototype.fetch注入额外的错误处理程序或成功处理程序,每篇文章都是How to add a default error handler to all Backbone models?。但是,这并没有让我直接访问实际的ajax调用返回,所以我没有任何东西可以调用“.done”,加上“fetch”只涵盖“get”ajax调用,我需要处理所有的错误Backbone ajax调用。

任何人都知道如何处理这个问题?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我决定覆盖Backbone.ajax。

我发现在调用fetch时我设置的任何属性(我认为这也可以用于保存和销毁,但还没有测试过),框架会将这些属性传递给此方法,因此它们可用于我在那里根据需要。我对于如何在那里做出关于Backbone的实现的假设(即假设参数将以特定格式传递给Backbone.ajax)并不感到兴奋,但这似乎仍然是最干净的方式

这是我的一些代码,因此您可以看到我如何阅读errorHandlingSettings参数。请注意,参数不会直接传递给Backbone.ajax - 它们由Backbone存储,然后在那里引用:

Backbone.ajax = function() {
    var currentArguments = {};
    if(typeof(arguments.callee) != 'undefined' 
        && typeof(arguments.callee.arguments) != 'undefined')
         currentArguments = arguments.callee.arguments[0];
   var errorHandlingSettings = {};
   if(typeof(currentArguments.errorHandlingSettings) != 'undefined')
      errorHandlingSettings = currentArguments.errorHandlingSettings;
      ... etc. - store the "successIfNoFaults" variable.
   var handleFaults = function(data){
      ... etc. (custom code using the errorHandlingSettings and successIfNoFaults variables) ...
   };

   return Backbone.$.ajax.apply(Backbone.$, arguments).done(handleFaults);
};

以下是我如何传递errorHandlingSettings参数(在我的视图中的初始化方法):

this.reservationHold.fetch({errorHandlingSettings: {errorPlace:"1",errorPosition:"errorDiv"}, successIfNoFaults:function(){that.render();}});

请注意,我也传递了另一个自定义参数," successIfNoFaults",这样我就可以避免调用"成功"如果带有故障的200响应返回,则回调。