0

backbonejs で書かれた単一ページの Web アプリケーションがあります。私は異なるルートを使用しており、各ルートはコントローラーに対応しています。アプリのルート URL (myapp.com/) またはパラメーターのないルート以外の URL (myapp.com/somelocation) を読み込むと、正しく動作します。しかし、クエリ パラメータ (つまり、myapp.com/somelocation?z=search) を使用してアプリを任意の場所に直接ロードしようとすると、問題が発生します。アプリは 2 回レンダリングされます。1 回目は myapp.com/somelocation?z=search に対応する正しいコントローラーで、2 回目は myapp.com/somelocation に対応するコントローラーでレンダリングされます。

ルート テーブルは次のようになります。

routes: {
        'login': 'login',
        'home': 'home',
        'timeline?*query': 'timelineWithQuery',
        'timeline': 'timeline',
         ...
        '*path': 'defaultRoute'
    }, ...

コントローラーは次のようになります。

defaultRoute: function() {
    router.navigate('home', {trigger: true});        
},

login: function(args) {
    var controller = new App.PageController.Mobile.AuthPageController($('body'));
    controller.executeLogin(args);
},

timeline: function(args) {
    var controller = new App.PageController.Mobile.TimelinePageController($('body'));
    controller.executeTimeline(args);
}, ...

Document.ready スクリプトは次のようになります。

// ...
router.navigate(window.location, {trigger: true});
// ...

router.navigate(window.location, {trigger: true}); を呼び出さない場合 明示的に、アプリケーションの開始ページをレンダリングするコントローラーはありません。myapp.com/timeline?foo=bar URLから開始しようとするまで、アプリを呼び出すと正しく動作します。これを行うと、アプリが 2 回レンダリングされます (ページのリロードなし)。

助言がありますか?ルーティング シナリオが豊富な backbonejs 駆動のシングル ページ アプリの一般的な document.ready ブートストラップ パターンは何ですか?

4

1 に答える 1

1

ナビゲートはlocation.pathname(pushState による) またはlocation.hashを使用するため、location.queryStringはナビゲーション手順の一部ではありません。この行がどのように正規表現に変換されるかはわかりませんが、 onではなく on で'timeline?*query': 'timelineWithQuery',毎回その正規表現を実行するため、実際には問題ではありません。my/pathmy/path?queryString

の前にすべてのルートを定義する必要がありますBackbone.history.start({pushState: true})。それを呼び出すと、現在のルートを実行する必要があるため、その後手動でナビゲートを呼び出す必要はありません。

于 2013-07-14T20:14:32.933 に答える