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

Assign object based on user selection of database row

抱歉,标题有点误导 - 我想不出一个简单的命名方法。

我有一个 HTML/JS single-page 应用程序(基于自定义框架,但没关系)。当应用程序启动时,它会向服务器发出 ajax 调用以检索数据。返回的数据是 object 的数组,表示随后可以是 "run" 但应用程序的场景。它看起来像这样:

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

该应用程序随后会向用户显示一个场景列表,供用户选择 运行 - 列表显示名称 - 用户只需单击其中一个即可 运行对应场景

申请的 javascript 部分是 two-fold。有通用部分和特定场景部分。要继续上面的简化示例,我将有:

application.js
scenarioOne.js
scenarioTwo.js

scenarioX.js 文件包含具有共同原型的 object 定义,例如:

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

这样,一旦我有一个特定场景的引用 object,我就可以调用它的方法,而不必担心我正在处理哪个场景。

到目前为止一切顺利 - 整个过程都很好。我苦苦挣扎的是如何根据用户选择选择正确的场景。在我的主 appliation.js 中,我想要这样的东西 (pseudo-code):

var scenario;

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

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

出于显而易见的原因,我不能依赖选定的场景 ID,因为这些 ID 由服务器决定并且可以更改。我觉得要使用的javascript object应该是服务器指定的,作为场景数据的一部分(我确实控制了服务器,所以这不是问题),所以从服务器返回的数据会变成:

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

然而,我将不得不使用 eval 来获得正确的 object:

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

而且我不太喜欢 eval

那么,有没有更好的方法来处理这个问题?或者 eval 我的朋友在吗?

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

所以你可以这样做:

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

heres a fiddle demonstrating this all simple like