2013-04-08 22 views
6

Basta chiedersi se è comunque necessario specificare un parametro come facoltativo in una rotta sammy js.parametri facoltativi sammyjs

ho visto da qualche parte che è possibile utilizzare

route/:foo/?:bar 

e che vi ingannare Sammy a pensare che bar è facoltativa. Tuttavia, se si esegue una query tuoi params senza bar si dotazione che sarà uguale l'ultimo carattere del URL, ad esempio

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

e

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

ma con bar sempre popolato in entrambi i casi non v'è alcun modo per controllare se è stato fornito.

Qualche consiglio su questo?

risposta

12

Sammy in realtà ha lasciato cadere la palla quando si tratta di parametri opzionali e di querystring. L'unico modo per far funzionare abbastanza bene questo è usare espressioni regolari e l'oggetto splat. Nel tuo esempio, si potrebbe scrivere:

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

Lo svantaggio è che è necessario il backslash alla fine dell'URL quando il parametro opzionale viene omesso.

L'oggetto splat è il risultato effettivo del metodo di corrispondenza JavaScript ed è un array .

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

Yep la palla era caduto. Questo è quello che stavo guardando e non è intenzione di tagliarlo con me, attualmente scrivendo una patch in modo che possa gestirli: D –

+0

+1 per spiegare l'oggetto splat. Grazie! :) –

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

L'unico problema con questo approccio è param2 inizierà con un '/', ma questo può essere rimosso facilmente.

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

Problemi correlati