我正在使用以下系统配置:
Chromium 14.0.835.202 Ubuntu 11.04使用Backbone 0.5.3
定义了以下路由和回调的骨干路由器:
, routes: {
'': 'handlerRoot'
, 'second': 'handlerSecond'
}
在这个系统中,我有以下行为:
- 如果我访问'root' (home),就会调用'handlerRoot'。好吧,这就是我所期待的。
- 如果我去'second' (#second), 'handlerSecond'被调用。好吧,这正是我所期待的。
- 如果我在'root',接下来我去'second',一旦我在那里单击后退按钮,作为按下后退按钮的结果回调正在被调用:第一个被称为'handlerSecond',并且下一个"handlerRoot"。事实上,在这里,我只是在期待'handlerRoot'被调用,因为当我推送时我作为用户的意图
- 如果我正在做以下路径:'root' -> 'second' -> 'root' ->'second',一旦在'second'(最后一个),我就点击Back按钮,由于这样的按压而被称为下面的按钮回调:第一个'handlerSecond',下一个'handlerRoot',下一个'handlerSecond',最后'handlerRoot'。这就像之前历史中所有与URL路径相关的回调都被调用(以相反的顺序)。同样,我的期望只是被称为'handlerRoot'(出于同样的原因,我从'second'回到root,我对所有的历史不感兴趣)。
我正在观看历史的Backbone.js代码,我看到它正在使用'onhashchange'事件(对于兼容的浏览器)。因此,我在浏览器控制台中手动设置如下:
function locationHashChanged() {
console.log(window.location.toString())
};
window.onhashchange = locationHashChanged;
我用这个配置做了相同的实验(1),(2),(3)和(4)。实际上,以前历史记录中的所有URL路径都是以相反的顺序打印的。例如在(3)中,当我按下后退按钮时,首先打印的是"second"的URL,然后打印的是"root"的URL。因此,Backbone行为确实是'onhashchange'行为。
我的问题是:哪一个是这种行为的原因(它有什么用处)?因为例如,如果我的回调只是切换视图,在例子(4)中,我切换视图四次,当我真正需要切换视图只有一次(改变视图被呈现在'秒'的视图被呈现在'根')。有什么方法可以让你有这种行为吗?
提前感谢!
EDIT:经过多次搜索,Chromium在控制台的后退按钮上有一个bug,路由像其他浏览器一样只触发一次。
我创建了一个jsFiddle来尝试你的问题,但我没有看到问题。
-
你可以在这里测试路由:http://jsfiddle.net/Atinux/V36ZU/show/
-
查看这里的代码:http://jsfiddle.net/Atinux/V36ZU/
我在Linux 10.04上用Chrome, Firefox和Opera测试了这个,没有任何问题…但是Chromium(15.0.874.106)有后退按钮的错误。所以我认为Chromium没有正确地解释来自Backbone JS的历史对象。
我回答了GitHub仓库重新打开它的问题:https://github.com/documentcloud/backbone/issues/646#issuecomment-3291944