7

ルートコールバックが実行される前に、ルートを別のルートにリダイレクトしようとしています。私は次のコードを持っています:

console.log("file loaded");
(function (History) {
    var _navigate = History.prototype.navigate;

    _.extend(History.prototype, {
        navigate: function (fragment, opts) {
            alert("adad");
            return _navigate.call(this, fragment, opts);
        }
    });
})(Backbone.History);

このコードBackbone.History.navigateはメソッドをラップし、メソッド呼び出しでアラートを表示します。ただし、ルートを変更しているときにこのアラートが表示されることはありません。

このconsole.log行は、ファイルがbackbone.jsの後にロードされていることを確認するためのものです。

このコードの何が問題になっていますか?

4

1 に答える 1

2

私はあなたが間違ったことを無効にしていると思います:それ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

于 2013-02-13T07:58:11.077 に答える