2013-04-08 3 views
6

Просто интересно, есть ли способ указать параметр как необязательный в маршруте sammy js.sammyjs необязательные параметры

я видел где-то, что вы можете использовать

route/:foo/?:bar 

и обманет Сэмми, думая, что бар является необязательным. Однако, если вы запрашиваете ваши Params без bar предоставил вам, что он будет равен последний символ URL, например

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

и

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

но с баром получения заселенной в обоих случаях нет никакой возможности проверьте, было ли оно поставлено.

Любые советы по этому вопросу?

ответ

12

Сэмми фактически сбросил мяч, когда речь заходит о необязательных параметрах и запросах. Единственный способ, с помощью которого я мог бы хорошо работать, - использовать регулярные выражения и объект splat. В вашем примере, можно было бы написать:

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

Недостатком является то, что вам нужно обратный слеш в конце URL, когда необязательный параметр опущен.

Объект splat является фактическим результатом метода совпадения JavaScript и является массивом .

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

Yep мяч был отброшен. Это то, на что я смотрел, и не собираюсь резать его со мной, в настоящее время пишу патч, чтобы он мог справиться с ними: D –

+0

+1 для объяснения объекта splat. Благодаря! :) –

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

Единственная проблема с этим подходом является param2 будет начинаться с «/», но это может быть легко удалена.

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