Sammy.js与Knockout.js没有运行路由与每个URL更改

时间:2013-05-04 00:16:31

标签: browser knockout.js webkit routes sammy.js

我有一条Sammy路线可识别任意数量的参数。路线看起来像这样:

get(/^\/(?:\?[^#]*)?#page\/?((?:[^\:\/]+\:[^\:\/]+\/?)*)$/g, function() {
    var params = {};
    var splat = this.params.splat[0];
    var re = /([^\:\/]+)\:([^\:\/]+)/g;
    match = true
    while(match = re.exec(splat)) {
        params[match[1]] = match[2];
    }
    self.loadData(params);
});

此代码有效。它的作用是识别模式#page/param1:value1/param2:value2/对任意数量参数的路由。我的loadData函数具有许多这些参数的默认值。我确信页面的实际加载没有问题,因为它在许多浏览器中的许多计算机上都可以100%运行。然而,它在我的Android浏览器和朋友的Mac的Safari和Chrome上都有奇怪的行为(在我的PC的Chrome上运行)。我注意到这些是Webkit浏览器。

行为是路由正确运行第一次URL更改,然后不会进行下一次URL更改(虽然浏览器栏中的URL确实总是更改),然后它将再次为第三次更改,并不会为第四个。也就是说,每隔一段时间都有效。对我来说,这似乎是一种非常奇怪的行为,我对如何调试它感到茫然。对于某些链接,我能够运行一个hack,以便在单击时将窗口位置设置为URL并使用runRoute('get', url);强制运行sammy代码。必须为页面上的每个点击事件添加此内容是不切实际的,并且无论如何这并不能真正解决所有URL更改。我可以做些什么来调试为什么每次URL更改时都没有运行我的路由?

1 个答案:

答案 0 :(得分:0)

对于那些遇到类似行为的人,在上述浏览器中的每次点击时,this.params.splat都未定义。它应该设置为URL的匹配部分(例如/#page/param1:value1/)。

我想出来解决这个问题的方法是将其添加到获取路径的顶部:

if(this.params.splat === undefined) {
    app.unload().run();
    return;
}

这不是问题的根源,它只是一个允许它重新运行路由的黑客,以便下次通过时params.splat未定义。如果有人有关于发生了什么的更多信息,我会感兴趣。