10

私はまだ理解できていない奇妙な問題を抱えています。それはおそらく私がそれに問題を抱えている理由です:)

まず、これがルーティングテーブルです...

routes: {
    '': 'root', //called
    'report': 'report', // called
    'report/add': 'reportAdd', // not called
    'report/print': 'reportPrint', // not called
    'report/settings': 'reportSettings', // not called
},

機能しているものと機能していないものをマークしたことがわかります。問題は、すべてのサブルート (つまりreport/add) が一致しないことに要約されます。

バックボーンの履歴は、次のように main.js で適切に呼び出されます。

app.Router = new Router();
Backbone.history.start({ pushState: true });

明らかに、ルートはサブルートではなく機能しているため、これは適切な場所にあります。rootオプションBackbone.historyとサイレントを試してみましたが、parameter運がありませんでした。

構成/セットアップの問題だと思いますが、答えを見つけることができませんでした。私は何を間違っていますか?どんな助けでも大歓迎です。

ところで、私はrequirejsとBackbone Boilerplateを使用していますが、それがどのように違いを生むかわかりません。

更新:提供された回答は技術的に正しいですが、問題はバックボーン ボイラープレートにあります。説明については、このブログ投稿の下部を参照してください。最初のコメント者と同じ問題を抱えています。

4

1 に答える 1

10

コメントで説明されているように、問題は、プッシュ状態スタイルの URL を使用する場合、サーバーがバックボーン ルート URL を認識しないことです。

たとえば、アプリケーションのルートが にserver/app/index.htmlあり、バックボーンがルーティングする URL を使用しようとしているとします/report/print。URLフラグメント ルーティングを使用すると、これで問題ありません。

http://server/app/index.html#report/print

サーバーはその後の部分を無視して#index.html を返します。その後、ロード時にバックボーンが にルーティングされreport/printます。

ただし、プッシュ状態ルーティングを使用している場合、URL は次のようになります。

http://server/app/index.html/report/print

サーバーはそのパスで何も認識しないため、404 エラーをスローします。


解決策は次のいずれかです。

  1. Backbone.js のドキュメントに記載されているように、サーバー コードを変更して、サーバーが各バックボーン ルートの正しいコンテンツをレンダリングするようにするか、
  2. (これは簡単だと思います)Webサーバー(IISApache )にURL書き換えを配置して、、など index.htmlのバックボーンルートであるリクエストに対して返されるようにします.index.html/report/printindex.html/report/add

たとえば、IIS では、アプリケーション ルートの下の web.config に次のように記述します。

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="index.html/report/print" value="index.html" />
        <add key="index.html/report/add" value="index.html" />
        <!-- etc -->
    </rewriteMap>
</rewriteMaps>
于 2012-12-10T17:20:43.490 に答える