Магистральные маршруты, не вызываемые

У меня странная проблема, о которой я пока не мог понять. Это очень просто, что, вероятно, связано с тем, что у меня проблемы с ним:)

Во-первых, здесь таблица маршрутизации...

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 все без везения.

Я предполагаю, что это проблема конфигурации/настройки, но я не смог найти ответы. Что я делаю не так? Любая помощь очень ценится.

Btw, я использую requirejs и Backbone Boilerplate, но я не вижу, как это может измениться.

ОБНОВЛЕНИЕ:. Хотя предоставленный ответ является технически корректным, проблема связана с базовым котлом. См. Нижнюю часть этого сообщения для объяснения. У меня такая же проблема, как и у первого комментатора.

Ответ 1

Как обсуждалось в комментариях, проблема в том, что при использовании URL-адресов стиля push-state сервер не распознает URL-адреса маршрута магистрали.

Для иллюстрации, скажем, ваш корневой каталог приложения находится в server/app/index.html, и вы пытаетесь использовать URL-адрес, который Магистраль маршрутирует в /report/print. С URL маршрутизация фрагментов, это нормально:

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

Сервер игнорирует часть после # и возвращает index.html; затем нагрузка Магистральные маршруты до report/print.

Но если вы используете маршрутизацию push-state, то URL-адрес выглядит следующим образом:

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

И сервер выдает ошибку 404, потому что он не распознает что-либо на этом пути, поэтому Backbone никогда не загружается.


Решение состоит в следующем:

  • Как отмечают Backbone.js docs, измените код сервера, чтобы сервер отображал правильный контент для каждого маршрута базовой линии или
  • (что мне кажется проще) переведите URL-адрес на веб-сервер (IIS, Apache), чтобы он возвращал index.html для любого запроса, который является магистральным маршрутом, например index.html/report/print, index.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>