回溯历史时未执行初始路由



我定义了一个路由器,有点类似于以下内容(为了演示目的,这里大大简化了):

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。一旦我做到了,历史就很好。

最新更新