Магистральные маршруты не вызываются
У меня странная проблема, которую я пока не смог выяснить. Это очень просто, поэтому, наверное, у меня с этим проблемы:)
Во-первых, вот таблица маршрутизации...
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 даже не загружается.
Решение состоит в том, чтобы:
- Как отмечается в документации Backbone.js, измените код сервера, чтобы сервер отображал правильное содержимое для каждого маршрута Backbone, или
- (что мне кажется проще) поместите перезапись 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>