2013-04-08 2 views
6

Je me demandais simplement s'il était possible de spécifier un paramètre comme facultatif dans une route sammy js.sammyjs paramètres optionnels

j'ai vu quelque part que vous pouvez utiliser

route/:foo/?:bar 

et qui duper sammy en pensant que la barre est facultative. Toutefois, si vous vous interrogez votre params sans bar fourni qu'il sera égal au dernier caractère de l'URL par exemple

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

et

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

mais avec bar se peuplé dans les deux cas il n'y a aucun moyen de Vérifiez si elle a été fournie.

Des conseils à ce sujet?

Répondre

12

Sammy a effectivement laissé tomber la balle quand il s'agit de paramètres facultatifs et de chaînes de requête. La seule façon de faire fonctionner cela est d'utiliser des expressions régulières et l'objet splat. Dans votre exemple, vous écrivez:

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

L'inconvénient est que vous avez besoin la barre oblique inverse à la fin de l'URL lorsque le paramètre optionnel est omis. L'objet splat est le résultat réel de la méthode de correspondance JavaScript et est un tableau .

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

Yep a été laissé tomber le ballon. C'est ce que je regardais et il ne va pas le couper avec moi, en train d'écrire un patch afin qu'il puisse les manipuler: D –

+0

+1 pour expliquer l'objet splat. Merci! :) –

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

Le seul problème avec cette approche est param2 commencera par un «/», mais cela peut être retiré facilement.

'#/go' => {result[0]: 'go', result[1]: ''} 
'#/go/here' => {result[0]: 'go', result[1]: '/here'} 
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();}); 
 
    });