sammyjs optional parameters

2020-02-29 00:12发布

问题:

Just wondering if there is anyway to specify a parameter as optional in a sammy js route.

I've seen somewhere that you can use

route/:foo/?:bar

and that will trick sammy into thinking that bar is optional. However if you query your params without bar supplied you that it will equal the last character of the url for example

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

and

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

but with bar getting populated in both cases there is no way to check if its been supplied.

Any tips on this?

回答1:

Sammy actually dropped the ball when it comes to optional parameters and querystrings. The only way I could get this to work fairly well is to use regular expressions and the splat object. In your example, you would write :

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

The downside is that you need the backslash at the end of the URL when the optional parameter is omitted.

The splat object is the actual result of the JavaScript match method and is an array.

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


回答2:

this.get("#/:param1(/:param2)?", function (context) {
    var result = this.params['splat'];
});

The only issue with this approach is param2 will start with a '/', but this can be removed easily.

'#/go' => {result[0]: 'go', result[1]: ''}
'#/go/here' => {result[0]: 'go', result[1]: '/here'}


回答3:

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



回答4:

this is an old post, still, if someone is looking for this:

another solution is to define two routes that map to the same function:

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

then in foo_handler check if the typeof(this.params.bar) is undefined, otherwise if it is defined the route with the bar param was used and bar has been specified