Backbone.History.extend({loadUrl:...})为有效路由返回false

时间:2015-10-15 14:33:40

标签: javascript backbone.js marionette backbone-routing

我试图扩展Backbone.History.loadUrl()以捕获404错误:

var History = Backbone.History.extend({
        loadUrl: function() {
            var match = Backbone.History.prototype.loadUrl.apply(this, arguments);
            if (!match) {
                console.log('route not found');
            }
            return match;
        }
    }); 

(Backbone.history = new History).start();

这是基于此处建议的解决方案:https://github.com/jashkenas/backbone/issues/308#issuecomment-9482299

我遇到的问题是,当我在有效路由上调用(Backbone.history = new History).start()时,它返回false。但是,当我在同一路线上调用Backbone.history.start()时,它返回true。

当我向扩展的loadUrl方法添加调试器时,match设置为false。

有关导致这种差异的原因的任何想法?

2 个答案:

答案 0 :(得分:1)

这应该有效。

var oldLoadUrl = Backbone.History.prototype.loadUrl;
_.extend(Backbone.History.prototype, {
  loadUrl : function () {
    var matched = oldLoadUrl.apply(this, arguments);
    if (!matched) {
      console.log('route not found');
    }
    return matched;
  }
});

答案 1 :(得分:0)

如果你真的写

(Backbone.history = new History).start();

您的新历史记录实例没有任何路由处理程序。因此,它不会匹配任何开始导致false的路线。在start()之后添加处理程序然后导航到该路由时,它当然会触发true

您应该在start()历史记录之前实例化路由器或添加路由处理程序:

Backbone.history = new History();

// either 
new CustomRouter();
// or
Backbone.history.route(/^some-route/, function(){ console.log("at test-login"); })

history.start();