Я создаю приложение Rails 4 и пытаюсь объединить историю магистральной сети location.hash с состоянием push-управления turbolinks. Приложение разбито на несколько меньших страниц, похожих на SPA.
Пример проблемы
У меня проблема в том, что когда я делаю Backbone.Router.navigate()
на странице, она ничего не регистрирует с турбоссылками. Вот гипотетический пример, демонстрирующий проблему:
- Посетите
/one
@router.navigate 'page-one'
- Местоположение становится
/one#page-one
@router.navigate 'page-two'
- Местоположение становится
/one#page-two
- Нажмите на ссылку
/two
- Turbolinks перехватывает и переходит к
/two
- Нажмите кнопку «Назад», вы все еще застряли на
/two
- Нажмите кнопку «Назад» еще раз, вы все еще застряли на
/two
- Нажмите кнопку «Назад» в третий раз, и вы вернетесь к
/one
.
Что я пробовал
Я предположил, что, вероятно, происходит то, что при навигации по магистрали браузер регистрирует изменение, а турбоссылки — нет. Я попытался разоблачить Turbolinks.reflectNewUrl
:
@Turbolinks = { visit, pagesCached, reflectNewUrl }
А затем модифицируем Backbone.Router.navigate
так, чтобы он регистрировался в турболинках каждый раз, когда мы перемещаемся:
navigate = Backbone.Router.prototype.navigate
Backbone.Router.prototype.navigate = (page, args...) ->
navigate page, args...
window?.Turbolinks?.reflectNewUrl "##{page}"
Это вроде сработало, Шаг 8 выше больше не зависает на /two
, но снова нажмите кнопку "Назад", и мы получим эту ошибку:
Uncaught TypeError: Cannot call method 'getElementsByTagName' of null turbolinks.js:142
removeNoscriptTags turbolinks.js:142
changePage turbolinks.js:111
fetchHistory turbolinks.js:69
(anonymous function) turbolinks.js:390
Значит что-то все же не так.
Теперь я надеюсь, что есть добрая душа, которая поможет мне и укажет на мою, возможно, очевидную ошибку :)