6

只是想知道是否无论如何在 sammy js 路由中将参数指定为可选。

我见过你可以使用的地方

route/:foo/?:bar

这会让 sammy 认为 bar 是可选的。但是,如果您在没有bar提供的情况下查询您的参数,它将等于 url 的最后一个字符,例如

'#/route/test' => {foo: 'test', bar: 't'}

'/route/test/chicken' => {foo: 'test', bar: 'chicken' }

但是在这两种情况下都填充了 bar ,因此无法检查它是否已提供。

对此有什么建议吗?

4

4 回答 4

12

当涉及到可选参数和查询字符串时,Sammy 实际上丢了球。我能让它很好地工作的唯一方法是使用正则表达式和 splat 对象。在您的示例中,您将编写:

this.get(/\#\/route\/(.*)\/(.*)/, function (context) {
        var result = this.params['splat'];
});

缺点是当省略可选参数时,您需要在 URL 末尾添加反斜杠。

splat 对象是 JavaScript match 方法的实际结果,是一个数组

'#/route/test/' => {result[0]: 'test', result[1]: ''}
'#/route/test/chicken' => {result[0]: 'test', result[1]: 'chicken'}
于 2013-04-10T19:00:56.383 回答
2
this.get("#/:param1(/:param2)?", function (context) {
    var result = this.params['splat'];
});

这种方法的唯一问题是 param2 将以 '/' 开头,但这可以很容易地删除。

'#/go' => {result[0]: 'go', result[1]: ''}
'#/go/here' => {result[0]: 'go', result[1]: '/here'}
于 2013-05-14T20:27:34.097 回答
-1

this.get('#/product/(:id)?', function(context) {
        var id = this.params['id'];
        context.app.swap('');
        context.render('templates/product.template', {base_url:base_url})
            .appendTo(context.$element()).then(function () {loadProduct();});
  });

于 2017-05-30T14:57:38.297 回答
-1

这是一个旧帖子,仍然,如果有人正在寻找这个:

另一种解决方案是定义两条映射到同一函数的路由:

this.get('#route/:foo', module.foo_handler)
this.get('#route/:foo/:bar', module.foo_handler)

然后在 foo_handler 检查 typeof(this.params.bar) 是否未定义,否则如果已定义,则使用带有 bar 参数的路由并且已指定 bar

于 2019-09-11T12:37:52.627 回答