Магистральный маршрутизатор, pushstate и относительные URL-адреса

Я делаю свое первое магистральное приложение. У меня включен pushstate. В роутере у меня два маршрута.

    'link1(/)' : 'link1Route',              
    'link2(/)' : 'link2Route'

На моей странице link1 у меня есть ссылка, указывающая на ссылку 2, например:

    <a href="link2">Link2</a>

Я нажимаю на ссылку, роутер берет на себя управление, и я перехожу к link2Route, как и ожидалось. Однако, если я наведу курсор на ссылку, в строке состояния будет указано, что ссылка находится по адресу domain.com/link1/link2, а не domain.com/link2. Это правильно, учитывая относительную структуру URL на странице link1. К сожалению, если пользователь решит открыть ссылку в новом окне или вкладке, магистральный маршрутизатор не сработает. Это ожидается, поскольку открытие в новом окне или вкладке приводит к загрузке новой страницы с сервера. Проблема, конечно, в том, что domain.com/link1/link2 не существует.

Какие есть способы справиться с этой ситуацией? Спасибо.


person landland    schedule 11.02.2013    source источник
comment
попробуйте изменить якорь на ‹a href=/link2›Link2‹/a›   -  person mateusmaso    schedule 12.02.2013
comment
Вау, я думаю, что это будет делать это. Так просто, но у меня это не сработало, потому что у меня не было настроенных виртуальных хостов, и поэтому изначально он переходил на localhost/link2, хотя я был в localhost/backboneapp/link2. Потрясающе, спасибо! Я поиграюсь с этим еще немного, но похоже, что это то, что мне нужно.   -  person landland    schedule 12.02.2013


Ответы (2)


Как указал mateusmaso, вам нужно изменить цель ссылки на «/ link2» (т.е. включая «/»).

Кроме того, при реализации pushState не забывайте, что ваш сервер должен отвечать контентом, если пользователь запрашивает URL-адрес «domain.com/link2». Ответ может быть index.html, если хотите, но сервер должен вернуть страницу для этого URL.

Если вы вернете index.html для всех ваших URL-адресов, связанных с Backbone, при запуске вашего приложения Backbone будет запущен код обработки маршрута, и будут отображаться правильные данные.

Если вы хотите узнать больше о маршрутизации и о том, как правильно ею управлять без необходимости передавать trigger: true при вызове navigate, ознакомьтесь со страницами 32–46 этого бесплатного образца PDF-файла: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf (полное раскрытие, я автор книги)

person David Sulc    schedule 20.05.2013
comment
спасибо, Дэвид. Я посмотрю ваш pdf. Я на самом деле сделал ваши уроки Марионетки, они были очень полезны для меня. Я уверен, что книга будет такой же :) - person landland; 21.05.2013
comment
Спасибо, я делаю все возможное, чтобы написать книгу, которая будет полезна читателям разного уровня. Но если вы хотите узнать больше только о маршрутизации, образца pdf должно быть достаточно. - person David Sulc; 21.05.2013

Вы должны предоставить правильный index.html на уровне сервера, так как это происходит еще до того, как JavaScript загрузится на странице.

http://readystate4.com/2012/05/17/nginx-and-apache-rewrite-to-support-html5-pushstate/

person Mauvis Ledford    schedule 11.02.2013
comment
Я уже переписываю апач. Это будет охватывать сценарии, в которых страница будет существовать. Таким образом, в моем примере domain.com/link1 и domain.com/link2 будут работать при прямой загрузке из закладки или обновления страницы из-за правил перезаписи Apache в ссылке, которой вы поделились. Но это не принимает во внимание мою проблему, а именно domain.com/link1/link2, которая не должна существовать. - person landland; 12.02.2013