Ответ 1
Невозможно реализовать первый пример, который вы предоставили. Вы не можете реализовать первый пример, потому что нет возможности "удалить" историю браузера с помощью Javascript.
Невозможно очистить историю сеанса или отключить навигацию назад/вперед от непривилегированного кода. Наиболее доступным решением является метод location.replace(), который заменяет текущий элемент истории сеанса указанным URL.
В лучшем случае вы можете запретить добавление текущей страницы в историю браузера с помощью window.location.replace
или window.history.replaceState
. Backbone.js обеспечивает удобный способ сделать это, вызвав router.navigate(fragment, [options])
на свой объект маршрутизатора и указав {replace: true}
в параметрах.
Вместо того, чтобы полагаться на разные маршруты, чтобы определить, какое представление отображать, я бы попытался вместо этого написать мастер-представление, которое могло бы обрабатывать отображение/скрытие определенных представлений.
ИЗМЕНИТЬ
Хорошо, входя в хакерскую территорию...
Так как кажется, что страница "Список категорий" - это страница, где история должна быть "reset", решение, которое я опубликовал, пытается решить оба варианта использования, о которых вы упоминали. Код отслеживает переменную historyState
, которая отображается, когда посещается страница "Список категорий" , а также другие страницы, посещенные после нее.
// in your application init...
$(function(){
window.historyState = -1;
router = new Backbone.Router({
routes: {
"category-list": category-list,
"category": category,
"item": item
}
category-list: function(){
historyState = 0;
},
category: function(){
if(historyState >= 0)
historyState++;
},
item: function(){
if(historyState >= 0)
historyState++;
}
});
});
- Если
historyState
--1
- мы еще не посетили страницу "Список категорий" . - Если
historyState
-0
- мы в настоящее время находимся на странице "Список категорий" . - Если
historyState
больше0
- количество посещенных страниц с момента просмотра страницы категории.
Теперь, когда ссылка используется для перехода на страницу "Список категорий" , убедитесь, что она вызывает следующий метод для обработки соответствующей навигации.
function routeToCategoryList(){
if( historyState > 0 ){
// 'category-list' already exists in our history route to that page.
window.history.go((historyState * -1));
} else {
// otherwise, don't store an entry for the current page we are on.
router.navigate("/category-list", {trigger: true, replace: true});
}
}
Если страница "Список категорий" уже была посещена, верните в историю соответствующее количество записей (это, к сожалению, сохраняет другие страницы в истории, поэтому вы все равно можете перейти к ним). В противном случае, если страница "Список категорий" еще не была посещена, перейдите к ней и не добавьте текущую страницу в историю.