2013-11-14 22 views
6

Ich muss das an die Arbeit:Backbone-Router mit mehreren Parametern

routes: { 
    ':product' : 'showProduct', 
    ':product/:detail': 'showProductDetail' 

showProductDetail nie aufgerufen wird, während das ': Produkt Route festgelegt ist, auch wenn es danach eingestellt. Ich habe folgendes versucht

routes: { 
    ':product(/:detail)': showProductOrDetail 
} 

Aber dies wird nicht aufgerufen, wenn nur der zweite Parameter ändert. Es ist wichtig, dass ich das Produkt selbst oder das Produkt und Detail in der URL habe.

Kann jemand das beheben?

Antwort

16

Es gibt eine kleine hacky Lösung für Ihr Problem. Ich habe das Gefühl, es ist ein schöner Weg, dies zu tun, aber das sollte funktionieren:

routes: { 
    "product/:id": "showProduct", 
    "product/:id/details/:did": "showDetails" 
}, 

showProduct: function(id) { 
    this.showDetails(id); 
}, 

showDetails: function(id, did) { 
    // Check did for undefined 

} 
+0

In diesem Fall würde Ihr Ansatz funktionieren, aber wie gesagt, ich möchte das Produkt auch in der zweiten Route haben, also kann ich etwas tun wie: mywebsite.com/#category/1/product/3/detail/1 – matteok

+0

Ich habe meine Antwort aktualisiert. Suchst du danach? –

+0

Das funktioniert nicht, wenn ich mywebsite/com/# product/1 nur richtig rufe? – matteok

1

Eine späte Antwort (über ein Jahr) .. aber Sie können RegEx verwenden in einem Backbone-Router dies zu erreichen. Mein Beispiel setzt voraus, dass die Parameter mit einer Zahl beginnen.

das heißt: localhost: 8888/# root/1param/2param

var router = Backbone.Router.extend({ 
    initialize: function() { 
     // Use REGEX to get multiple parameters 
     this.route(/root/, 'page0'); 
     this.route(/root\/(\d+\S+)/, 'page1'); 
     this.route(/root\/(\d+\S+)\/(\d+\S+)/, 'page2'); 
    }, 
    page0:function(){ 
     console.log("no id"); 
    }, 
    page1:function(id1){ 
     console.log(id1); 
    }, 
    page2:function(id1,id2){ 
     console.log(id1); 
     console.log(id2); 
    } 
}); 

Hoffnung, das hilft.