2011-11-14 21 views
0

我有輕微的兩難處境。 這不是一般於Backbone.js的,但它肯定是造成我的問題得到Backbone.Router.routes工作:在javascript/backbone中添加/附加散列鍵

問題: 我有一堆在我的JS硬編碼的路線遵循這些鍵值對哈希模式,如:

whatever.route : {"/url/goes/here":"functionNameHere"} 

基本上這是做一個URL綁定到一個函數名稱來調用,當URL被改變。

我的問題是,我需要預先設置的URL與郎/區域設置字符串,以便該字符串看起來像「/ EN/URL /雲/這裏」

// this will always return "en" or "fr" or aany 2 letter language code  
var lang = window.location.pathname.split("/")[1].length ==2?window.location.pathname.split("/")[1]:false; 


workspace = new Workspace(//Workspace is basically just a Backbone.router.extend Object 
      { 
       // the routes obj is basically a sequence of routes 
       routes: { 
        "/":     "home", 
        "/home":    "home", 
        "/terms":    "terms", 
        "/news":    "blog", 
        "/news/:title":   "blogpost", 
        "/about":    "about", 
        "/about/partners":  "partners", 
        "/about/people":  "people", 
        "/values/ethics":  "ethics", 
        "/values/innovation": "innovation", 
        "/work":    "work", 
        "/work/process":  "process", 
        "/work/awards":   "awards", 
        "/work/:id":   "workdetail", 
        "/contact":    "contact", 
        "/contact/join":  "joinus", 
        "/contact/enquiries": "enquiries" 
       }, 
       lang : lang 
      } 
     ); 

我INTIAL想到的是沿着線:

....routes{ lang+"/url/goes/here": "functionNameHere", 
... 

沒有骰子錯誤 接下來我嘗試使用:

.... {航線的eval(郎+ 「/ URL /雲/這裏」): 「functionNameHere」,再次個...

沒有骰子..

肯定那裏有一種方式來動態前置上飛哈希鍵?

有人嗎?

非常感謝

解決方案由於T.J. (見下)

如果有人對Backbone.js具體的方式感興趣。 我所做的就是使用解決方案T.J.建議在我的初始化函數如下:

尼斯T.J.Crowder !!

不知道我是否應該修改了原稿

initialize: function(params){ 
     var tmpr = {}; 
     for(var i in params.routes) 
     { 
      tmpr[params.lang+i] = params.routes[i]; 
     } 
     this.routes = tmpr; 
...... 

回答

1

對象中的文字必須是文字(可以是令牌的一部分的:左側[例如,不帶引號]或字符串字面[例如,用引號])。它不能是一個表達。所以你不能在對象字面上做到這一點。相反,你必須這樣做:

var routes = {}; 
routes[lang + "/url/goes/here"] = "functionNameHere"; 
// ... 
workspace = new Workspace(
      { 
       routes: routes, 
       lang : lang 
      } 
     ); 

在那裏,我們使用了括號符號指定屬性的routes對象。當使用括號表示法時,可以使用表達式來確定屬性名稱。這是JavaScript的一個較冷卻且不太爲人所知的特性,可以使用點符號和文字屬性名稱(obj.foo)或括號表示法和字符串屬性名稱(obj["foo"])來訪問屬性。 (實際上,這就是你在索引到數組時進行的操作  — a[0] = 5;   —因爲數組aren't really arrays at all。)