允许带有散列的超链接绕过Sammy JS路由

时间:2013-09-16 08:25:05

标签: javascript sammy.js

我定义了以下服务器端URL映射:

/main/item1
/main/item2

我添加了SammyJS路由支持,以便我能够执行以下操作:

/main/item1#/         /* main view */
/main/item1#/topups   /* topup view */

我这样设置了SammyJS:

s.app = Sammy(function() {
    this.get('#/topups', function() {
        console.log('Initializing topups view.');
    });
    this.get('#/', function() {
        console.log('Initializing main view.');
    });
});

问题是,我的页面中有一个摘要部分,它重定向到另一个“项目”的topup视图。例如,我在网址/main/item1#/,并且在此页面中,存在标记<a href="/main/item2#/topups">item 2's topups</a>

我希望将其重定向(页面刷新)到新的网址,但是,似乎SammyJS正在拦截/main/item2#/topups来电,只是运行我已定义的this.get('#/topups')路由。

我希望由于哈希之前的网址路径/main/item1/main/item2不同,因此不会触发SammyJS路由。

有没有办法防止在SammyJS中发生这种行为?

2 个答案:

答案 0 :(得分:2)

我对萨米的了解不多,但我可以告诉你路由器的行为方式,它是否在路由可能性中捕获了第一个匹配,因此,以#/ topups结尾的任何内容都将被认为是相同的只要它在哈希标志之后。

所以你最好用这种方式定义路由器:

this.get('#/topups/:item', function() {
    console.log('Initializing topups view for item: '+ item);
})

然后使用以下网址调用页面:

<a href="/main/#/topups/item2">item 2's topups</a>

我希望这就是你要找的东西

答案 1 :(得分:1)

我非常确定使用完整的网址重定向你。

<a href="http://www.example.com/main/item2#/topups">Item 2 top ups for the lazy coder</a>

但是,这会导致页面重新加载。如果您修改Labib的答案,您可以获得更好的解决方案:

this.get('#/topups/:item', function () {
  console.log('Doing some post processing on current item');
  console.log('Now redirecting you to ' + this.params.item);
  window.location.href = 'http://example.com/menu/# + this.params.item +#/topups';
});

这将再次导致页面重新加载,但如果您不介意,那么只需要一种方法。

注意:Sammy还会为您检查表单提交。每次我使用它都会让我感到震惊。 This post有解决方案。