1

我正在尝试生成一个动态弹出菜单,其中列表中的项目来自 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 文件中的最后一个选项。

我很困惑为什么代码正确地创建了具有正确标签的弹出菜单项,但未能将相同的标签传递给回调。我希望至少其中一些是有道理的!

我究竟做错了什么?

4

0 回答 0