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

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

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

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, но я не понимаю, как это будет иметь значение.

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

1 ответ

Решение

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

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

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

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

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

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

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


Решение состоит в том, чтобы:

  1. Как отмечается в документации Backbone.js, измените код сервера, чтобы сервер отображал правильное содержимое для каждого маршрута Backbone, или
  2. (что мне кажется проще) поместите перезапись 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>
Другие вопросы по тегам