2013-04-08 69 views
1

我使用Require.js和骨幹,並有一個骨幹路由器模塊,如:變量函數名需要與骨幹

define([ 
    "views/global", 
    "views/project/edit", 
    "views/project/list", 
], function(GlobalView, edit, list){ 
    return Backbone.Router.extend({ 

     routes: { 
     "projects/:action/" : "projectsAction", 
     }, 

     projectsAction : function(action) { 
     /* .... lots of code cut out here .... */ 
     /* Create and render the action specified */ 
     this.subView = new eval(action+"()").render(); 

     } 
    }); 
}); 

這是一個例子,我已經砍掉了很多的設置代碼出來項目行動。
我想要URL:/projects/list運行projectAction,action param = list,然後list模塊從Require.js函數被調用。我目前正在使用eval(),但我想知道是否有更好的方法?

基本上,在Javascript中,你可以用另一個變量名稱引用一個變量,而不使用eval()

我想一個較短的版本是,你怎麼辦:

var name = "Math.random"; 
name(); // = 0.34343.... 

沒有eval()

回答

3

您無法訪問字符串中具有名稱的變量。但是你可以創建一個映射:

var actions = { 
    edit: edit, 
    list: list 
}; 

然後你就可以通過鑰匙進入功能:

projectsAction : function(action) { 
    this.subView = new actions[action]().render(); 
} 
+0

很感謝,這看起來像我問的最接近的東西。雖然後見之明我的問題是模棱兩可的,所以有一個更好的方法(見下文),我實際上正在嘗試做什麼。 – Mark 2013-04-09 09:28:34

1

IMO最好的辦法,就是用requirejs的require功能:

projectsAction : function(action) { 
    /* .... lots of code cut out here .... */ 
    /* Create and render the action specified */ 
    var self = this; 
    require('views/project/' + action, function(view) { 
     (self.subView = new view).render(); 
    } 
    } 

因爲它也會將樣板文件從很多操作中剪切掉。

+0

啊,太棒了!我是新來的需要,我不知道你可以做到這一點。如你所說,它也大大簡化了所有的樣板。我打算將其他答案標記爲正確的,因爲它是我實際詢問的最接近的答案(事後看來我的問題不明確),但是這非常有幫助,謝謝。 – Mark 2013-04-09 09:27:25