0

问题

我想在我的应用程序中有一个默认错误处理程序来处理所有意外错误,但有时(例如在保存模型时)可能会出现许多错误,所以我想以自定义方式处理它们而不是显示通用错误页面。

我之前的解决方案

我的Backbone.sync功能曾经有这个:

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

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

新解决方案 1

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

新解决方案 2

error模型,但这不会让我覆盖默认的错误处理程序。

新解决方案 3

传入一个自定义选项来禁用错误的全局触发,但这感觉是多余的。


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


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

4

1 回答 1

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行。

编辑:

这不是最漂亮的解决方案,但可能对您有用。创建一个新的模型基类来使用,而不是扩展 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/ 。但是这样一来,无论您是否将错误回调传递给主干获取/保存/销毁,您都会收到错误消息。

于 2013-02-19T19:45:42.087 回答