我正在使用以下系统配置:
Ubuntu 11.04 上的 Chromium 14.0.835.202 使用 Backbone 0.5.3
定义了以下路由和回调的主干路由器:
, routes: {
'': 'handlerRoot'
, 'second': 'handlerSecond'
}
在这个系统中,我有以下行为:
- 如果我访问“根”(家),则会调用“handlerRoot”。好的,这正是我所期待的。
- 如果我转到“第二”(#second),则会调用“handlerSecond”。好的,这正是我所期待的。
- 如果我在'root',然后我进入'second',一旦我点击后退按钮,由于按下后退按钮,两个回调被调用:第一个被称为'handlerSecond',和下一个'handlerRoot'。实际上,在这里我期望只调用“handlerRoot”,因为当我按下后退按钮时,我作为用户的意图是返回上一页。
- 如果我正在执行以下路径:'root' -> 'second' -> 'root' -> 'second',并且在 'second' (最后一个)中一次,我单击 Back 按钮,作为此推送的结果称为以下回调:第一个“handlerSecond”,下一个“handlerRoot”,下一个“handlerSecond”,最后是“handlerRoot”。就像之前历史中与 URL 路径关联的所有回调都被调用(以相反的顺序)。同样,我的期望只是被称为“handlerRoot”(出于同样的原因,我将从“第二”回到根,我对所有历史都不感兴趣)。
我正在观看 History 的 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) 中,我切换视图四次,而我真的只需要切换一次视图(更改在“秒”中呈现的视图在“根”中呈现的视图)。有没有办法得到这种行为?
提前致谢!