[英]Backbone.js - extend router with beforeRoute filter
我正在尝试在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);
});
}
});
但是,我不确定接下来我需要做什么。 我需要使用我想要的“路由前”逻辑来定义一个函数,但我不明白它将如何被调用。
重写的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 ...");
});
只是因为像我这样的其他人很困惑,为什么这不起作用。 (再也没有)自从Backbone版本0.9.10以来它似乎被打破了。 (不知道为什么)
但是在版本1.0.0中,您现在可以使用函数文字而不是对方法的引用。 http://backbonejs.org/#changelog
所以你在打电话给路线之前可以做点什么......
routes: {
'your-route' : function(){ if(yourCondition){ yourAction(); }}
}
另一种方法是扩展Router.route功能。 下面是我需要做的一个例子(检查用户是否经过身份验证)。 它基本上是原始的Backbone代码(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
和_.bind
所以this
是你在使用路由器时所期望的那个。 否则我得到一个“这是未定义的”错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.