对于一个有点误导性的标题感到抱歉 - 我无法想出一种轻松命名的方法。
我有一个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
我的朋友在这里?
答案 0 :(得分:0)
如果您在全局范围内执行此操作,则所有变量都将存在于窗口对象中。
所以你可以这样做:
scenario = window[serverdata[selected_id].jsobject];