我定义了一个路由器,有点类似于以下内容(为了演示目的,这里大大简化了):
var MyRouter = Backbone.Router.extend({
routes: {
'': 'search',
'directions': 'directions',
'map': 'map'
},
search: function () {
// do something
},
directions: function () {
// do something
},
map: function () {
// do something
},
initialize: function () {
this.listenTo(myModel, 'change', this.updateNavigation);
Backbone.history.start({ pushState:true });
},
updateNavigation: function () {
var selected = myModel.get('selected');
this.navigate(selected);
}
});
updateNavigation调用正确创建了所有历史记录条目,当我点击后退按钮返回我生成的历史记录时,每个条目的路由都会启动,直到我到达初始条目。在这一点上,即使url已经用该历史条目进行了更新,在该点上应该解释url的路由也不会触发。知道这里可能发生了什么吗?我是不是对历史的运作方式做了一些糟糕的假设?
编辑:
我似乎得到了不一致的结果——不执行的并不总是最初的条目,有时是在我第一次回顾历史之后的任何事情。也就是说,我点击了一次后退按钮,url发生了变化,路由正确启动。我又打了一次,网址变了,路线没有开火。这有点像我做错了什么,但我一点也不知道。
不要问我为什么,但当我没有在@navigation上触发:true时,我的浏览器返回按钮似乎无法正常工作。
我非常简短的假设是Backbone.history.start({ pushState:true });
用错了地方。
据我所知,主干历史应该在路由器实例创建之后开始。比如
var router = new MyRouter();
Backbone.history.start({ pushState:true });
我发现了这个问题。我使用了一个查询字符串,并根据应用程序中的操作更新查询字符串。每次修改querystring时,我都会添加另一个历史条目,但历史条目的实际路由部分并不总是更改。Backbone不会基于相同的路由但使用不同的querystring做任何不同的事情,所以我不得不放弃使用querystring,而只生成restful url。一旦我做到了,历史就很好。