2013-07-18 38 views
7

试图使用Backbone的导航属性。Backbone在Firefox中导航触发两次

this.navigate("week/" + companyName + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false }); 

上面的代码执行一次。

它击中这样的:

routes: { 
    "week/:companyName/:employeeNo/:weekEnd": "getWeek" 
}, 

然后这个功能被击中两次:

getWeek: function (companyName, employeeNo, weekEnd) { 
    console.log('getWeek:', companyName, employeeNo, weekEnd); 
} 

它在IE和Chrome在Firefox登录两次,只有一次。

这里有什么问题?我原本甚至没有将触发器设置为true,并且Firefox忽略了它,并且仍然触发了URL。

+0

您应该逐步浏览带有未定义主干源代码,特别是在调用loadUrl时调用它,并调用它作为运行回调的函数。 – Andrew

+0

我还发现Firefox中的Backbone.js导航触发方式与Mac上的Chrome + Safari方式有所不同,并且都没有想到。 – prototype

回答

6

我最近在使用Backbone.navigate进行两次服务器调用时遇到类似的问题。在我的情况下,这是因为我们没有编码字符串。你的公司名称是否有任何应该编码的字符?

你可以尝试:

this.navigate("week/" + escape(companyName) + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false }); 
+1

我之前也遇到过这个问题,并且修复与编码有关。 –

+0

同样的事情发生在变音符号:http://jsfiddle.net/adyz/qcged76e/2/你对此有何看法? @AdamLockhart? –

4

步进作为我碰到了同样的问题,得到了下面的问题就在这里。

正如大家所提到的,问题来自URL编码。现在至于为什么这个问题只出现在Firefox ...

让我们先快速总结当散列变化时如何调用路由。这里有3个主要功能:

  • 使用loadURL:此功能是一个将打电话给你的路由处理。
  • 导航:这是用于手动更改路线的功能。如果触发器标志设置为true,该函数将调用loadUrl
  • checkUrl:此功能被设置为回调的窗口对象的onhashchange事件(当它可用当然)。它也在某些条件下运行loadUrl

现在,我们进入有趣的部分。

当您运行导航时,Backbone会缓存您导航到的片段。也会调用hash更改,checkUrl。然后该函数将检查缓存的哈希值是否等于当前值,以免执行loadUrl如果之前调用导航,因为这意味着它已被调用。为了进行比较,checkUrl获得当前使用函数getFragment的散列,其使用getHash。这里是getHash的代码:

getHash: function(window) { 
    var match = (window || this).location.href.match(/#(.*)$/); 
    return match ? match[1] : ''; 
}, 

和你有你的问题。 location.href在Firefox中是URI编码的,但不在chrome中。因此,如果您导航到另一个散列(带或不带触发标志),在Firefox中,Backbone会缓存未经编码的散列版本,然后将其与编码版本进行比较。如果你的散列包含一个应该被编码的字符,比较的结果是否定的,Backbone将执行它不应该执行的路由处理程序。

根据解决方案,以及人们之前说过,你的URI应该被编码。

+0

嘿@Loamhoof,我也有类似的问题,但这次在Mac上的Safari。在这里你可以找到问题:http://jsfiddle.net/adyz/qcged76e/2/ - 基本上,我认为这是因为变音符号。 - 编码或不。如果您点击第二个链接,网址将被路由功能解码。非常感谢 –

+0

它也在Safari上。 –

+1

嗨@AdrianFlorescu。我鼓励你摆弄Backbone的代码,看看有什么不对,更具体地说,前面提到的'checkUrl'函数可能是你问题的关键。这个响应是前段时间写的(我认为是Backbone 1.0),但是似乎Backbone的代码的这部分从那以后没有多少变化:http://backbonejs.org/docs/backbone.html#section-232。祝你好运,如果你解决了你的问题,请发表你的发现;) – Loamhoof