Safari两次触发Backbone路由

时间:2013-01-05 16:36:02

标签: backbone.js safari backbone-routing

我对Safari中的Backbone路由器感到头疼

我有这段代码:

app.navigate("ask/" + encodedSearchKey,true);

并在我的路由器中:

var AppRouter = Backbone.Router.extend({

  routes:{
    "":"main",
    "ask/*encodedSearchKey":"askSearch",
  },

  askSearch:function(){
    ...
  },
  ...

});
app = new AppRouter();
Backbone.history.start();

在chrome中,它按预期工作,URL被路由并且一次调用askSearch函数

然而,在Safari中,askSearch函数实际上被执行了两次

当我尝试

app.navigate("ask/" + encodedSearchKey,false);

在chrome中,没有按预期调用askSearch函数,但实际上它被调用了一次

我已经浏览了调试器并且非常确定app.navigate行总是只被调用一次,除了路由器本身之外没有任何其他东西可以触发askSearch函数

现在我知道我可以通过检测浏览器类型来解决这个问题,但我没有在网上发现任何类似的问题,似乎人们没有这个问题,我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

我想我刚遇到同样的问题并找到了一个解决方案...... Safari似乎从虚拟目的中剥离了字符串以用于虚荣目的,然后重新触发路由器导致视图再次呈现但缺少查询字符串数据。

我在路由器中使用的解决方案相当简单:

myView: function () {
    if (window.location.search.length) {
        myView.render();
    } else {
        return false;
    }
}

这会阻止第二个渲染继续进行。虽然只有在你想要用查询字符串渲染该视图时,这个os才真正适用。

答案 1 :(得分:0)

navigate函数的第二个参数不是布尔值,而是选项对象:

app.navigate("ask/" + encodedSearchKey, {
    trigger: true
});

答案 2 :(得分:0)

在Firefox中

是url未编码,溃败会发射两次,有时...... ...