根据用户对数据库行的选择分配对象

时间:2015-04-21 22:12:37

标签: javascript eval

对于一个有点误导性的标题感到抱歉 - 我无法想出一种轻松命名的方法。

我有一个HTML / JS单页面应用程序(基于自定义框架,但它并不重要)。当应用程序启动时,它会对服务器进行ajax调用以检索数据。返回的数据是一个对象数组,表示可以随后运行的场景。但申请。它看起来像这样:

[
  {
    id: 1,
    name: 'Scenario 1',
    ... (lots of other stuff)
  },
  {
    id: 2,
    name: 'Scenario 2',
    ... (lots of other stuff)
  },
  ...
]

然后,应用程序向用户显示一个场景列表,以选择要运行的场景 - 列表显示名称 - 用户只需单击其中一个即可运行相应的场景。

应用程序的javascript部分是双重的。这里有通用部分和特定场景部分。要继续上面的简化示例,我将:

application.js
scenarioOne.js
scenarioTwo.js

scenarioX.js个文件包含具有公共原型的对象定义,例如:

var scenarioOne = {
    var1: 'abc',
    ...
    init: function() { ... },
    start: function() { ... },
    reset: function() { ... },
    processSpecial: function() { ... },
    ...
}

这样,一旦我有一个特定场景对象的引用,我可以在其上调用方法,而不用担心我正在处理的场景。

到目前为止一切都那么好 - 这一切都很好。我正在努力的是如何根据用户选择选择正确的场景。在我的主appliation.js中,我希望有这样的东西(伪代码):

var scenario;

switch(selected scenario) {
case 'scenario1':
    scenario = scenarioOne;
    break;
case 'scenario2':
    sceario = scenarioTwo;
    break;
...
}

scenario.init();
scenario.start();

由于显而易见的原因,我不能依赖选定的方案ID,因为这些ID由服务器决定并且可以更改。我觉得要使用的javascript对象应该由服务器指定为方案数据的一部分(我确实可以控制服务器,因此它不是问题),因此从服务器返回的数据将变为:< / p>

[
  {
    id: 1,
    name: 'Scenario 1',
    jsobject: 'scenarioOne',
    ... (lots of other stuff)
  },
  ...
]

然而,我必须使用eval来获取正确的对象:

eval('scenario = ' + serverdata[selected_id].jsobject);

我不是eval的忠实粉丝。

那么,有没有更好的方法来解决这个问题?或者eval我的朋友在这里?

1 个答案:

答案 0 :(得分:0)

如果您在全局范围内执行此操作,则所有变量都将存在于窗口对象中。

所以你可以这样做:

scenario = window[serverdata[selected_id].jsobject];

heres a fiddle demonstrating this all simple like