これを行う別の方法は、 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
そうしないと、「これは未定義です」というエラーが発生しました。