2013-04-08 17 views
6

Ich frage mich nur, ob es sowieso gibt, um einen Parameter als optional in einer sammy js Route anzugeben.sammyjs optionale Parameter

Ich habe irgendwo gesehen, dass Sie

route/:foo/?:bar 

verwenden können, und das wird sammy verleiten zu denken, dass Bar ist optional. Allerdings, wenn Sie Ihre params Abfrage ohne bar Sie geliefert, dass es das letzte Zeichen der URL zum Beispiel

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

und

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

aber mit Bar bevölkert zu werden in beiden Fällen gleich wird es keine Möglichkeit zu Überprüfen Sie, ob es geliefert wurde.

Irgendwelche Tipps zu diesem Thema?

Antwort

12

Sammy ließ den Ball fallen, wenn es um optionale Parameter und Querystrings geht. Der einzige Weg, wie ich das zum Laufen bringen kann, ist die Verwendung von regulären Ausdrücken und dem splat-Objekt. In Ihrem Beispiel würden Sie schreiben:

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

Der Nachteil ist, dass Sie den umgekehrten Schrägstrich am Ende der URL müssen, wenn der optionale Parameter weggelassen wird.

Das Objekt splat ist das tatsächliche Ergebnis der JavaScript-Vergleichsmethode und ist ein Array.

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

Yep wurde der Ball fallen gelassen. Das ist es was ich mir angeschaut habe und es wird es nicht mit mir schneiden, momentan schreibe ich einen Patch damit es damit umgehen kann: D –

+0

+1 für die Erklärung des Splat Objekts. Vielen Dank! :) –

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

Das einzige Problem bei diesem Ansatz ist param2 mit einem ‚/‘ beginnen, aber dies kann leicht entfernt werden.

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