1

Я создал супер простое приложение Backbone с просто маршрутизатором и двумя представлениями, чтобы попытаться прибить правильный способ обработки маршрутизации без каких-либо хэш-панелей.Магистральный маршрутизатор без hashbangs

var Router = Backbone.Router.extend({ 
    routes: { 
     '': 'index', 
     'episodes': 'episodes' 
    }, 

    index: function() { 
     var view = new IndexView(); 
     view.render(); 
    }, 

    episodes: function() { 
     var view = new EpisodesView(); 
     view.render(); 
    } 
}); 

var IndexView = Backbone.View.extend({ 
    el: $('#primary'), 
    render: function() { 
     console.log('index view'); 
    } 
}); 

var EpisodesView = Backbone.View.extend({ 
    el: $('#primary'), 
    render: function() { 
     console.log('episodes view'); 
    } 
}); 

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

Я понимаю, что history объект позволяет вперед и назад навигации между страницами, который является большим. Тем не менее, способ, которым он фактически реализован, кажется немного запутанным для меня.

Например, я создал простой сервер MAMP для работы с файлом index.html и JS-файлом. Переходим к http://backbone:8888/, журналам консоли index view, как я рассказываю. Тем не менее, переход на http://backbone:8888/episodes (путем ввода его в адресную строку) возвращает 404. НО, если я перейду к http://backbone:8888/#episodes, URL-адрес перенаправляется на http://backbone:8888/episodes (без хеш-бэнга), и я получаю episodes view, вход в консоль, что, очевидно, означает, что он бьет это EpisodesView вид.

Отсюда я могу перемещаться между индексами и эпизодами. (обратные удары /, хиты/эпизоды). Все в порядке и денди, пока я не нажму обновить, пока снова на /episodes. 404 ...

Итак, мой вопрос заключается в следующем: как настроить базовую станцию ​​для обработки URL-адресов, не полагаясь на hashbangs? Все, что я нашел на эту тему, говорит «О, просто pushState!». Ну, я использую pushState и, как я уже описал выше, вы не можете набрать URL-адрес, например /episodes, без получения 404.

+0

Это проблема на стороне сервера. Вероятно, Apache ищет index.html в эпизодах папки в вашем веб-каталоге. Возможно, вы можете попробовать переписать URL-адрес Apache на свой root index.html независимо от того, к какому URL-адресу вы переходите. Вероятно, это не очень хорошее долгосрочное решение, поскольку вы, вероятно, захотите добавить какую-то логику на стороне сервера (Node.JS, Python, Ruby, PHP и т. Д.). Тогда вам придется решить, хотите ли вы отображать правильную страницу на стороне сервера среди других проблем. – Gohn67

ответ

1

Когда вы используете состояние push, страницы подаются с задней стороны, что означает, что вы должны определить соответствующий маршрут в своем заднем конце, который соответствует маршруту переднего конца.

Если задний конец не находит запрошенный маршрут, он отправит сообщение 404, потому что он не будет знать, что ему подавать. В вашем случае просмотр эпизодов запускается на уровне передней панели, но браузер не имеет DOM для визуализации представления, когда страница обновляется, потому что ничего не было выполнено.

По умолчанию маршрут http://backbone:8888/ будет служить индексному файлу, так как он настроен для веб-сервера.
Я не уверен, какую технологию задней части вы используете, но для обслуживания файла от http://backbone:8888/episodes просто убедитесь, что на вашем заднем конце установлен маршрутизатор, который обслуживает запрошенный маршрут, и он должен работать.

Смежные вопросы