2013-04-08 16 views
6

Zastanawiasz się, czy istnieje opcja określenia parametru jako opcjonalnego w trasie sammy js.Parametry opcjonalne sammyjs

widziałem gdzieś, że można użyć

route/:foo/?:bar 

i że będzie oszukać Sammy do myślenia, że ​​bar jest opcjonalne. Jednak jeśli kwerendy swoich params bez bar dostarczany, że będzie ona równa ostatni znak url np

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

i

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

ale z barem uzyskiwanie zaludnionych w obu przypadkach nie ma możliwości, aby sprawdź, czy został dostarczony.

Jakieś wskazówki na ten temat?

Odpowiedz

12

Sammy faktycznie upuścił piłkę, jeśli chodzi o opcjonalne parametry i kwerendy. Jedynym sposobem, jaki mógłbym uzyskać, aby działało całkiem dobrze, jest użycie wyrażeń regularnych i obiektu typu splat. W przykładzie, należy napisać:

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

Minusem jest to, że trzeba się odwrotny ukośnik na końcu adresu URL, gdy opcjonalny parametr jest pominięty.

Obiekt splat jest faktycznym wynikiem metody dopasowywania JavaScript i jest to array.

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

Tak piłka została porzucona. Właśnie na to patrzyłem i nie zamierzam go wycinać, pisząc teraz łatkę, aby mogła sobie z nimi poradzić: D –

+0

+1 za wyjaśnienie obiektu splat. Dzięki! :) –

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

Jedyny problem z tym podejściem jest param2 rozpocznie się od „/”, ale to może być łatwo usunięte.

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