2012-03-07 161 views
37

是否有可能在Backbone.js路由中有可選參數?Backbone.js路由可選參數

e.g這樣的:

routes: 
    "search/[:query]": "searchIndex" 

代替:

routes: 
    "search/": "searchIndex" 
    "search/:query": "searchIndex" 
+1

加布轟的答案應該是公認的答案,而不是@mu太短。 – 2015-02-27 13:15:27

+1

是的!技術進步! – TTT 2015-02-27 14:10:04

+0

像「search /:query」這樣的路由不適合我。但「搜索」工作正常。任何想法? – 2015-12-16 11:31:18

回答

87

從Backbone 0.9.9開始,您可以添加帶括號的可選參數。

例如,在你的路由對象,你可以像這樣定義一個可選路線部分:

routes: { 
    "organize(/:action)": "displayOrganize" 
} 

現在的URL路徑將匹配/#organize和路線像/#organize/create

請記住,如果你需要一個像/#organize/路線(以斜槓)得到認可,你可以這樣做:

routes: { 
    "organize(/)(:action)": "displayOrganize" 
} 
+0

如何處理displayOrganize中的操作?你可以做'displayOrganize:function(action){if(action){//做些什麼...}}'? – 1nfiniti 2013-05-31 14:25:17

+0

這應該是被接受的答案。 – 2015-02-27 13:14:46

3

有關使用*splat什麼:

路線router.routes

路由哈希將帶有參數的URL映射到路由器上的功能,類似於View的事件哈希。路線可以包含參數部分,:param,它們在斜槓之間匹配單個URL組件;和splat部分*splat,它可以匹配任意數量的URL組件。

例如,"search/:query/p:page"的路由將匹配#search/obama/p2的片段,將"obama""2"傳遞給該動作。 "file/*path"的路線將匹配#file/nested/folder/file.txt,將"nested/folder/file.txt"傳遞給該操作。

8

您可以添加使用the route method手動正則表達式根據路線:

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

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

所以這樣的事情應該工作:

this.route(/^search\/(.*)?/, 'searchIndex'); 

然後searchIndex將被調用你什麼或你的:query作爲其參數。

缺點是你不能把正則表達式路由到你的routes對象中。如果你想把它們放在一起,你可以在你的路由器的initialize方法中加入route的所有路由。

16

可能是剛剛宣佈超過一個航,一有多餘的ARG,一個沒有最簡單的方法:

routes:{ 
     "authProxy/:hash": "authProxy",                                         
     "authProxy/:hash/:url": "authProxy" 
} 

然後只檢查他們在你的方法:

authProxy: function(hash, url){ 
    if (url){ 
     // Hash and URL. 
    }else{ 
     // Just hash. 
    } 
} 

注我比其他兩個答案要好得多,因爲其他開發人員很容易理解發生了什麼。