【问题标题】:Site wide error management with backbone使用主干进行站点范围的错误管理
【发布时间】:2013-02-21 00:05:34
【问题描述】:

问题

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

我之前的解决方案

我的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 中的最新版本,而不是他们主页上的最新版本。

【问题讨论】:

    标签: backbone.js error-handling


    【解决方案1】:

    您可以在覆盖的同步中执行此操作吗?这似乎完成了与您之前所做的相同的事情。

    // 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/。 但是这样一来,无论您是否将错误回调传递给主干获取/保存/销毁,您都会收到错误。

    【讨论】:

    • 问题是 options.error 总是被定义,因为 Backbone 创建了它。
    • 是的,但是var error = options.error 是传递给sync 的错误,所以检查error 而不是options.error 应该可以工作。如果不传入错误回调进行保存、获取等操作,如果有错误会触发'api:error'。
    • 我在他们的主分支中使用最新的,所以它总是包含错误:jsfiddle.net/fFtrC
    • 好的,这肯定会改变一些事情。
    • @NicklasA。更新的答案,实际上我更喜欢这个解决方案而不是覆盖同步。多一点代码,但你不必乱用sync
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多