2013-04-08 13 views
6

Chỉ cần tự hỏi liệu có cách nào để chỉ định tham số là tùy chọn trong tuyến đường sammy js hay không.thông số tùy chọn sammyjs

Tôi đã nhìn thấy ở đâu đó mà bạn có thể sử dụng

route/:foo/?:bar 

và điều đó sẽ đánh lừa vào suy nghĩ sammy thanh đó là không bắt buộc. Tuy nhiên nếu bạn truy vấn params của bạn mà không bar cung cấp với bạn rằng nó sẽ tương đương với ký tự cuối cùng của url ví dụ

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

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

nhưng với thanh bị dân cư trong cả hai trường hợp không có cách nào để kiểm tra xem nó đã được cung cấp chưa.

Mọi mẹo về điều này?

Trả lời

12

Sammy thực sự đã loại bỏ bóng khi nói đến tham số tùy chọn và truy vấn. Cách duy nhất tôi có thể làm cho việc này hoạt động khá tốt là sử dụng các biểu thức thông thường và đối tượng splat. Trong ví dụ của bạn, bạn sẽ viết:

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

Nhược điểm là bạn cần dấu gạch chéo ngược ở cuối URL khi tham số tùy chọn bị bỏ qua.

Đối tượng splat là kết quả thực tế của phương thức đối sánh JavaScript và là một mảng .

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

Yep bóng đã bị bỏ. Đó là những gì tôi đang nhìn và nó sẽ không cắt nó với tôi, hiện đang viết một bản vá để nó có thể xử lý chúng: D –

+0

1 để giải thích đối tượng splat. Cảm ơn! :) –

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

Vấn đề duy nhất với phương pháp này là param2 sẽ bắt đầu với một '/', nhưng điều này có thể được gỡ bỏ một cách dễ dàng.

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