2013-09-24 85 views
0

我有一個路由器這樣定義:嚴格的參數匹配

var MyRouter = Backbone.Router.extend({ 
    routes: { 
    // catch-all for undefined routes 
    "*notfound" : "notFound", 
    }, 

    initialize: function(options) { 
    this.route("my_resource/clear_filters", 'clearFilters'); 
    this.route("my_resource/:id", 'show'); 
    }, 

    show: function(id){ 
    console.log('show', id); 
    }, 

    clearFilters: function() { 
    console.log('clearFilters'); 
    }, 

    notFound: function() { 
    console.log('notFound'); 
    }, 
}); 

var app = {}; 
app.MyRouter = new MyRouter(); 
Backbone.history.start({silent: true}); 

因此下面的網址將被映射爲:

var opts = {trigger: true}; 
app.MyRouter.navigate('/foo', opts);      // logged -> 'notFound' 
app.MyRouter.navigate('/my_resource/123', opts);   // logged -> 'show', '123' 
app.MyRouter.navigate('/my_resource/clear_filters', opts); // logged -> 'clearFilters' 
app.MyRouter.navigate('/my_resource/some_thing', opts); // logged -> 'show', 'some_thing' 

我怎麼能限制my_resource/:id路線僅匹配數字參數,以便app.MyRouter.navigate('/my_resource/some_thing')notFound處理?

回答

2

fine manual

路線router.route(route, name, [callback])

手動創建用於路由器的路由,該route參數可以是一個路由字符串或正則表達式。來自路由或正則表達式的每個匹配捕獲都將作爲參數傳遞給回調。

所以你總是可以說這樣的話:

this.route(/my_resource\/(\d+)/, 'show') 

路由器的initialize如果你需要在路徑更加精確的控制不是骨幹網的字符串模式給你。

+0

是的,我知道路由可以使用正則表達式,但據我瞭解,你可以使用正則表達式或命名參數 - 你不能有一個命名的正則表達式 - 所以沒有辦法將匹配的正則表達式傳遞給回調函數。 –

+1

「來自路由或正則表達式的每個匹配捕獲都將作爲參數傳遞給回調函數。」在將路由轉換爲正則表達式時,骨幹在內部用正則表達式替換':name'。或者你是否試圖發送幾個路由模式到同一個路由處理程序,並且你想知道哪個路由在處理程序中被觸發? 「 –

+0

」當將路由轉換爲正則表達式時,主幹在內部替換:用正則表達式組名稱東西「 明白了!那是失蹤的一塊。謝謝:) –