私はあなたが間違ったことを無効にしていると思います:それnavigate
はあなたが思っているように使われていません。
の一部を見てみましょうBackbone.history.start
:
// Start the hash change handling, returning `true` if the current URL matches
// an existing route, and `false` otherwise.
start: function(options) {
//...
if (this._hasPushState) {
Backbone.$(window).on('popstate', this.checkUrl);
} else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {
Backbone.$(window).on('hashchange', this.checkUrl);
} else if (this._wantsHashChange) {
this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
}
checkUrl
バックボーンでルーティングを処理するさまざまな方法はすべて、ではなく通過することがわかりますnavigate
。このcheckUrl
メソッドは少し忙しい作業を行い、loadUrl
;を呼び出します。忙しい仕事の一部はこれです:
if (this.iframe) this.navigate(current);
そのようnavigate
に呼び出されますが、<iframe>
シミュレーションに使用されているhashchange
場合popstate
にのみ、古いバージョンのIEを使用している場合にのみ発生するイベントとAFAIKが発生します。
コードを介して通常のパスに戻ります。checkUrl
忙しい仕事や電話をしているのを見てきましたloadUrl
が、それは何をするのでしょうか?loadUrl
これを行います:
loadUrl: function(fragmentOverride) {
var fragment = this.fragment = this.getFragment(fragmentOverride);
var matched = _.any(this.handlers, function(handler) {
if (handler.route.test(fragment)) {
handler.callback(fragment);
return true;
}
});
return matched;
}
route
のメソッドHistory
とのroute
メソッドをRoute
見るhandler.callback
と、ルーターの1つからルートハンドラーを呼び出し、ルーティングイベントをトリガーしていることがわかります。
navigate
置き換えるメソッドは、ほとんどの場合、'sによってのみ使用されRouter
ますnavigate
。
navigate: function(fragment, options) {
Backbone.history.navigate(fragment, options);
return this;
}
ルートハンドラーが呼び出される前にリダイレクトする場合は、次のように置き換えることができますloadUrl
。
(function(History) {
var _loadUrl = History.prototype.loadUrl;
_.extend(History.prototype, {
loadUrl: function() {
var args = [].slice.apply(arguments);
args[0] = this.getFragment(args[0]);
// If args[0] is the fragment that you want to
// redirect then replace it here or do whatever
// needs to be done.
return _loadUrl.apply(this, args);
}
});
})(Backbone.History);
デモ: http: //jsfiddle.net/ambiguous/e4KYK/
全体として、通常のルートハンドラーでリダイレクトを処理する方がよいと思います。問題のあるルートが呼び出されたら、navigate
便利なルーターを呼び出すだけです。
メソッドBackbone.History
以外では文書化されていないため、ここにあるすべてのものは変更される可能性があることに注意してください。start