使用骨干网进行全站点错误管理

时间:2013-02-19 19:31:14

标签: backbone.js error-handling

问题

我希望在我的应用程序中有一个默认的错误处理程序来处理所有意外错误,但有些时候(例如在保存模型时)有很多错误可以预期,所以我想以自定义方式处理它们而不是显示一般错误页面。

我之前的解决方案

我的Backbone.sync函数曾经有过这个:

if(options.error)
  options.error(response)
else
  app.vent.trigger('api:error', response) # This is the global event channel

然而,这不再有效,因为骨干总是包装错误函数,因此它可以触发模型上的error事件。

新解决方案1 ​​

我可以覆盖模型和集合上的fetchsave方法来包装options.error并将代码放在上面,但这感觉有点难看。

新解决方案2

在模型上收听error,但这不允许我覆盖默认的错误处理程序。

新解决方案3

传入自定义选项以禁用全局触发错误,但这感觉很多。


我错过了什么吗?有推荐的方法吗?


我可以补充说我正在使用他们的git repo中的最新版本,而不是他们主页上的最新版本。

1 个答案:

答案 0 :(得分:0)

你可以在覆盖的同步中执行此操作吗?这似乎完成了你以前做过的事情。

// error is the error callback you passed to fetch, save, etc.
var error = options.error;
options.error = function(xhr) {
  if (error) error(model, xhr, options);
  // added line below.
  // no error callback passed into sync.
  else app.vent.trigger('api:error', xhr); 

  model.trigger('error', model, xhr, options);
};

此代码来自Backbone源代码,我只添加了else行。

编辑:

这不是最漂亮的解决方案,但可能适合您。创建一个新的Model基类来使用,而不是扩展Backbone.Model,扩展它。

var Model = Backbone.Model.extend({

  // override fetch. Do something similar for save, destroy.
  fetch: function(options){
     options = options ? _.clone(options) : {};
     var error = options.error;
     options.error = function(model, resp) {
       if (error) error(model, resp);
       else app.vent.trigger('api:error', resp); 
     };

     return Backbone.Model.prototype.fetch.apply(this, [options]);
  },
});

var MyModel = Model.extend({});
var model = new MyModel();
model.fetch(); // error will trigger 'api:error'

实际上,这可能比覆盖sync更好。

可能的替代方法是使用:http://api.jquery.com/ajaxError/。 但是,无论你是否将错误回调传递给backbone fetch / save / destroy,你都会得到错误。