2013-04-08 82 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

當談到可選參數和querystrings時,Sammy實際上放棄了球。我可以很好地工作的唯一方法是使用正則表達式和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

沒錯球被丟棄。這就是我正在看的,它不會與我一起切割,目前正在編寫一個補丁,以便它可以處理它們:D – 2013-04-11 09:53:46

+0

+1用於解釋splat對象。謝謝! :) – 2013-09-03 23:18:40

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

這種方法唯一的問題是參數2將與「/」開始,但是這可以很容易地取出。

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