另一種方式來做到這一點是擴展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
和_.bind
所以this
是使用路由器時,你會期望之一。否則,我得到了「這是未定義的」錯誤。
完美,謝謝! –