我的路由器定义与以下类似(为了演示目的而大大简化):
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的路径。知道这里可能会发生什么吗?我是否对历史如何运作做出了一些错误的假设?
编辑:
似乎我得到了不一致的结果 - 它并不总是只是初始条目没有执行,有时在我第一次回到历史记录之后的任何事情。也就是说,我点击后退按钮一次,网址发生变化,路线正常点火。我再次点击它,网址改变,路线不开火。这让我有些不对劲,但我没有任何线索。
答案 0 :(得分:0)
不要问我为什么,但是当我不触发时,我的浏览器后退按钮似乎无法正常工作:@navigate时为真。
答案 1 :(得分:0)
我非常简短的假设是Backbone.history.start({ pushState:true });
在错误的地方使用。
据我所知,骨干历史记录应该在创建路由器实例之后开始。像,
var router = new MyRouter();
Backbone.history.start({ pushState:true });
答案 2 :(得分:0)
我发现了这个问题。我正在使用查询字符串并根据应用程序中的操作更新查询字符串。每次修改查询字符串时,我都添加了另一个历史记录条目,但历史记录条目的实际路径部分并不总是会改变。 Backbone不会根据相同的路由做任何不同的事情但是使用不同的查询字符串,所以我不得不放弃使用查询字符串而只是制作宁静的网址。一旦我这样做,历史就可以了。