Невозможно реализовать первый приведенный вами пример. Вы не можете реализовать первый пример, потому что нет способа «удалить» историю браузера, используя Javascript.
Нет способа очистить историю сеанса или отключить навигацию назад / вперед из непривилегированного кода. Наиболее близким доступным решением является метод location.replace (), который заменяет текущий элемент истории сеанса указанным URL-адресом.
- https://developer.mozilla.org/en/DOM/window.history
В лучшем случае вы можете предотвратить добавление текущей страницы в историю браузера, используя window.location.replace
или window.history.replaceState
. Backbone.js предоставляет удобный способ сделать это, вызвав router.navigate(fragment, [options])
на вашем маршрутизаторе и указав {replace: true}
в опциях.
Вместо того чтобы полагаться на разные маршруты для определения того, какой вид отображать, я бы вместо этого попытался написать главный вид, который мог бы обрабатывать показ / скрытие определенных видов.
EDIT
Хорошо, входим на хакерскую территорию ...
Поскольку кажется, что страница «Список категорий» - это страница, на которой следует «сбрасывать» историю, опубликованное мною решение пытается решить оба варианта использования, которые вы упомянули. Код отслеживает переменную 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});
}
}
Если страница «список категорий» уже посещена, вернитесь в историю на соответствующее количество записей (это, к сожалению, сохраняет другие страницы в истории, поэтому вы все еще можете перейти к ним). В противном случае, если страница «список категорий» еще не посещена, перейдите к ней и не добавляйте текущую страницу в историю.