我正在尝试生成一个动态弹出菜单,其中列表中的项目来自 json 文件。我希望这里有足够的细节让你做出判断。
json的简化内容为:
{
"locationdetails" : {
"type": "combobox",
"default" : "Yellowstone",
"description" : "Default starting location:",
"options" : {
"Death Valley" : "Death Valley",
"Yellowstone" : "Yellowstone"
}
}
}
我想要一个包含两个菜单项(“黄石”和“死亡谷”)的弹出菜单。当其中任何一个被单击时,它会使用回调函数调用另一个传递正确变量的函数(例如 getLocation("Yellowstone") 或 getLocation("Death Valley"))。
我有以下代码,但它不能正常工作:
var output = "";
for ( var place in this.settings.metaBindings.locationdetails.settings_obj.json.locationdetails.options ) {
output += place.toString()+"\n";
this._menu.addAction(_(place.toString()), Lang.bind(this, function() {
global.log(place.toString());
}) );
};
global.log(output);
*this.settings.metaBindings.locationdetails.settings_obj.json.locationdetails.options* 似乎是我可以访问 json 文件中所有选项的地方。(让我知道是否有更简单的方法来获得这个!)
出于测试目的,我记录了在输出中处理 for 循环时传递的内容,并将所有内容放在全局错误日志中。在单击菜单项时,它只会将传递给它的地名打印到日志上(而不是调用另一个函数)。
当我使用窥镜来验证发生了什么时,我发现:
1) 创建了两个菜单项,每个都有正确的标签(黄石或死亡谷)
2)输出正确输出“黄石”和“死亡谷”
3)每次点击弹出的菜单项,即使点击“死亡谷”,日志也总是打印“黄石”。进一步调查显示它总是打印我的 json 文件中的最后一个选项。
我很困惑为什么代码正确地创建了具有正确标签的弹出菜单项,但未能将相同的标签传递给回调。我希望至少其中一些是有道理的!
我究竟做错了什么?