我自己一直在 Sammy.js 中研究查询参数,并发现(尽管 API 文档中没有提及)Sammy 确实支持查询参数。它只是将在路由中找到的任何查询参数添加到路由的 Sammy.EventContext.params 数组中。如果您的路线结构如下:
Sammy(function() {
this.get("#/routeName/", function(context) {
alert("{'param1': '" + context.params.param1 + "', 'param2': '" + context.params.param2 + "'}");
});
});
你会发现,如果你去路由“#/routeName/”,你会得到“{'param1': undefined, 'param2': undefined}”,但是如果你去“#/routeName/?param1= aaaa¶m2=bbb”,你会得到“{'param1': 'aaaa', 'param2': 'bbb'}”。这允许您以许多 REST API 开发人员熟悉的方式处理可选参数。
至于为什么你的其他两条路线不起作用:
#/routeName/:param1/:param2
具有命名的必需参数,该参数至少需要一个非/(正斜杠)字符才能匹配路由。至少,您必须转到沿着“#/runRoute/a/b”行的路线才能触发该路线的运行。如果不提供正则表达式来代替命名参数,您将无法轻松获得所需的效果。
#/routeName/?:param1&:param2
由于“?”,#/routeName/ 后面的 / 是可选的Sammy 路由中表示前一个字符或表达式(可以使用括号定义)的特殊字符是可选的。使用此路由,您可能会匹配 '#/routeName&b' 以及 #/routeName/e&b',在这两种情况下 param1 都设置为 'e',而 param2 在这两种情况下都设置为 'b'。由于 Sammy 中存在查询参数规则,您将无法轻松定义“?”在路由内,但您可以使用 URL 转义形式“%3F”。
希望这能回答您的问题,我看到了这个问题并且最近一直在研究类似的问题。我不会声称自己是对 Sammy 最了解的人,但我们在我目前的工作中使用它,这是迄今为止我们能够弄清楚的。