我正在使用Require.js和Backbone,并且有一个Backbone路由器模块,如:
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();
}
});
});
这是一个例子,我从projectAction中删除了很多设置代码
我希望URL:/projects/list
运行projectAction,使用action
param = list
,然后调用Require.js函数中的list
模块。我目前正在使用eval()
,但我想知道是否有更好的方法?
基本上,在Javascript中,您是否可以使用另一个变量名引用变量而不使用eval()
?
我想是一个较短的版本,你怎么做:
var name = "Math.random";
name(); // = 0.34343....
没有eval()
?
答案 0 :(得分:3)
您无法访问具有字符串名称的变量。但是你可以创建一个映射:
var actions = {
edit: edit,
list: list
};
然后您可以通过键访问该功能:
projectsAction : function(action) {
this.subView = new actions[action]().render();
}
答案 1 :(得分: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();
}
}
因为它也会削弱样板,使其免于大量行动。