Oll*_*liM 10 browser-history backbone.js
我的backbone.js有三个视图:
我正在使用backbone.js路由器在这些视图之间导航.用户在应用程序中流动1 < - > 2,2 < - > 3和3 - > 1.用户可以使用浏览器后退和前进按钮来回导航,这是想要的行为.深度链接到任何项目也有效.
问题是我想保持历史清洁.这是一个示例用法流程:
另一个例子:
关于如何以干净的方式实现这一点的任何想法?
sha*_*ren 12
无法实现您提供的第一个示例.您无法实现第一个示例,因为无法使用Javascript"删除"浏览器历史记录.
无法清除会话历史记录或禁用非特权代码的后退/前进导航.最接近的可用解决方案是location.replace()方法,该方法用提供的URL替换会话历史记录的当前项.
最多可以使用window.location.replace或阻止将当前页面添加到浏览器历史记录中window.history.replaceState.Backbone.js通过调用router.navigate(fragment, [options])路由器对象并{replace: true}在选项中指定,提供了一种方便的方法.
我不会依赖不同的路径来确定要显示的视图,而是尝试编写一个可以处理显示/隐藏特定视图的主视图.
好的,进入hacky领域......
由于"类别列表"页面似乎是"重置"历史记录的页面,因此我发布的解决方案尝试解决您提到的两种用例.代码跟踪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++;
}
});
});
Run Code Online (Sandbox Code Playgroud)
historyState是-1- 我们还没有访问过"类别列表"页面.historyState是0- 我们目前在"类别列表"页面上.historyState更大0- 自查看"category-list"页面以来访问过的页数.现在,只要使用链接导航到"类别列表"页面,请确保它调用以下方法来处理相应的导航.
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});
}
}
Run Code Online (Sandbox Code Playgroud)
如果已经访问过"类别列表"页面,请在历史记录中返回相应数量的条目(遗憾的是,这会将其他页面保留在历史记录中,因此您仍可以继续查看它们).否则,如果尚未访问"类别列表"页面,请导航到该页面,并确保不将当前页面添加到历史记录中.