0

次のようなルーターを定義しました (ここではデモ用に大幅に簡略化しています)。

var MyRouter = Backbone.Router.extend({
    routes: {
        '': 'search',
        'directions': 'directions',
        'map': 'map'
    },
    search: function () {
        // do something
    },
    directions: function () {
        // do something
    },
    map: function () {
        // do something
    },
    initialize: function () {
        this.listenTo(myModel, 'change', this.updateNavigation);
        Backbone.history.start({ pushState:true });
    },
    updateNavigation: function () {
        var selected = myModel.get('selected');
        this.navigate(selected);
    }
});

履歴エントリは updateNavigation 呼び出しによってすべて適切に作成されています。生成した履歴に戻るために戻るボタンを押すと、最初のエントリに到達するまで、エントリごとにルートが起動します。 . その時点で、その履歴エントリで URL が更新されていても、その時点で URL を解釈する必要があるルートは起動しません。ここで何が起こっているのでしょうか?歴史がどのように機能するかについて、私はいくつかの悪い仮定をしていますか?

編集:

一貫性のない結果が得られるようです-実行されないのは常に最初のエントリだけではなく、履歴を最初に戻した後の何かである場合があります。つまり、戻るボタンを 1 回クリックすると、URL が変更され、ルートが適切に起動します。もう一度押すと、URL が変わり、ルートが起動しません。何か間違ったことをしているような気がしますが、手がかりがありません。

4

3 に答える 3

0

私の非常に簡単な仮定は、それBackbone.history.start({ pushState:true });が間違った場所で使用されているということです。

私の知る限り、バックボーン履歴の開始は、ルーター インスタンスの作成後に行う必要があります。お気に入り、

var router = new MyRouter();
Backbone.history.start({ pushState:true });
于 2013-08-23T11:04:06.830 に答える
0

私は問題を発見しました。クエリ文字列を使用し、アプリケーション内のアクションに基づいてクエリ文字列を更新していました。クエリ文字列を変更するたびに、別の履歴エントリを追加しましたが、履歴エントリの実際のルート部分が常に変更されるとは限りませんでした。バックボーンは、同じルートに基づいて異なることを行うことはありませんが、クエリ文字列が異なるため、クエリ文字列の使用を放棄し、代わりに安らかな URL を作成する必要がありました。私がそれをしたら、歴史はうまくいきました。

于 2013-08-31T00:08:35.163 に答える