3

我正在尝试在 Backbone.js 中为我的路由实现一个前置过滤器。我在这里找到了以下代码-

var MyRouter = Backbone.Router.extend({
    route: function(route, name, callback) {
        return Backbone.Router.prototype.route.call(this, route, name, function() {
            this.trigger.apply(this, ['beforeroute:' + name].concat(_.toArray(arguments)));
            callback.apply(this, arguments);
        });
    }
});

但是,我不确定下一步我需要做什么。我需要用我想要的“路由前”逻辑定义一个函数,但我不明白它将如何被调用。

4

3 回答 3

6

被覆盖的route函数触发一个名为 的事件beforeroute:routename,然后调用原始route函数。因此,如果您有这样的路线:

var MyRouter = Backbone.Router.extend({
    routes: { 
        "": "home"
    },
    // ...
});

然后,您将使用以下命令订阅beforeroute事件:

var router = new MyRouter()

router.on("beforeroute:home", function() {

    // before route logic here...
    alert("Home route is about to get hit ...");
});

小提琴演示。

于 2012-12-08T02:31:13.997 回答
0

只是对于像我这样的其他人感到困惑,为什么这不起作用。(不再)自 Backbone 版本 0.9.10 以来,它似乎被破坏了。(不知道为什么)

但在 1.0.0 版中,您现在可以使用函数文字而不是对方法的引用。http://backbonejs.org/#changelog

所以你可以在调用路线之前做一些事情......

routes: {
   'your-route' : function(){ if(yourCondition){ yourAction(); }}
}
于 2013-04-30T09:55:05.387 回答
0

另一种方法是扩展 Router.route 函数。下面是我需要做的一个示例(检查用户是否经过身份验证)。它基本上是原始的主干代码(1.0.0)加上我的自定义代码(标有注释):

  Backbone.Router.prototype.route = function(route, name, callback) {
    if (!_.isRegExp(route)) route = this._routeToRegExp(route);
    if (_.isFunction(name)) {
      callback = name;
      name = '';
    }
    if (!callback) callback = this[name];
    // here my custom code
    callback = _.wrap(callback, _.bind(function(cb) {
      if (name == 'login' || sessionModel.authenticated()) {
        _.bind(cb, this)();
      } else {
        this.navigate('login', {trigger: true});
      }
    }, this));
    // finish my custom code
    var router = this;
    Backbone.history.route(route, function(fragment) {
      var args = router._extractParameters(route, fragment);
      callback && callback.apply(router, args);
      router.trigger.apply(router, ['route:' + name].concat(args));
      router.trigger('route', name, args);
      Backbone.history.trigger('route', router, name, args);
    });
    return this;
  };

请注意_.wrap_.bindthis也是您在使用路由器时所期望的。否则我得到一个“这是未定义的”错误。

于 2013-04-30T12:23:48.933 回答