1

我正在使用 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:使用param =/projects/list运行 projectAction,然后调用 Require.js 函数中的模块。我目前正在使用,但我想知道是否有更好的方法?actionlistlisteval()

基本上,在 Javascript 中,你可以用另一个变量名来引用一个变量,而不使用eval()?

我想一个更短的版本是,你怎么做:

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

没有eval()

4

2 回答 2

3

您不能访问具有字符串中名称的变量。但是您可以创建一个映射:

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

然后您可以通过按键访问该功能:

projectsAction : function(action) {
    this.subView = new actions[action]().render();
}
于 2013-04-08T14:35:36.743 回答
1

imo最好的方法是使用requirerequirejs的功能:

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();
    }
  }

因为它还会减少样板文件的大量操作。

于 2013-04-08T14:48:42.373 回答