当出现错误服务器端时,我调用的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调用。
任何人都知道如何处理这个问题?
非常感谢!
答案 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响应返回,则回调。