私の頭に浮かぶ唯一のオプションは、現在の関数を上書きすることですRouter.route
。現在、次のようになっています。
route: function(route, name, callback) {
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
if (!callback) callback = this[name]; // this is of interest
Backbone.history.route(route, _.bind(function(fragment) {
var args = this._extractParameters(route, fragment);
callback && callback.apply(this, args);
this.trigger.apply(this, ['route:' + name].concat(args));
Backbone.history.trigger('route', this, name, args);
}, this));
return this;
},
やりたいことは、必要な条件が満たされているかどうかをチェックする関数ですべてのコールバックをラップし、ラップピーを呼び出すか、ログインに再ルーティングすることです。ここではアンダースコアのwrap
- 関数が役立ちます。
route: function(route, name, callback) {
... // same as above
if (!callback) callback = this[name];
_.wrap(callback, function(cb) {
if (userIsLoggedIn()) {
cb();
} else {
this.navigate("url/to/login");
}
});
... // same as above
},
もちろん、無限ループを作成しないように、実際のログイン ルートのチェックを追加する必要があります。
編集:
ソースを変更する必要はありません。これを行う最も簡単な方法は次のとおりです。
var CustomRouter = Router.extend({
route: function() {
// your overwrite here
}
});
これは Backbone にネイティブであるため、コメントにあるものよりもこれを使用してください!
お役に立てれば