1

我对 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 函数没有按预期调用,但在 Safari 中它实际上被调用了一次

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

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

4

3 回答 3

1

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

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

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

这会阻止第二次渲染继续进行。尽管此操作系统仅在您只想使用查询字符串呈现该视图时才真正适用。

于 2014-12-16T12:07:04.400 回答
0

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

app.navigate("ask/" + encodedSearchKey, {
    trigger: true
});
于 2013-01-06T13:41:38.617 回答
0

在 Firefox 中是 url 未编码的 rout 会触发两次,有时......

于 2014-08-26T08:51:05.563 回答