sammyjs可选参数

时间:2013-04-08 09:50:35

标签: javascript sammy.js

只是想知道是否还有一个参数在sammy js路由中指定为可选参数。

我见过你可以使用的地方

route/:foo/?:bar

这将欺骗sammy认为bar是可选的。但是,如果您在没有bar的情况下查询您的参数,则它将等于网址的最后一个字符,例如

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

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

但是如果在两种情况下都填充了条形码,则无法检查它是否已被提供。

有关此的任何提示吗?

4 个答案:

答案 0 :(得分:12)

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

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

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

splat对象是JavaScript匹配方法的实际结果,是数组

'#/route/test/' => {result[0]: 'test', result[1]: ''}
'#/route/test/chicken' => {result[0]: 'test', result[1]: 'chicken'}

答案 1 :(得分: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'}

答案 2 :(得分:0)



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();});
  });




答案 3 :(得分:0)

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

另一种解决方案是定义两个映射到同一功能的路由:

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

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