1

リスト内の項目がjsonファイルから取得される動的ポップアップメニューを生成しようとしています。あなたが判断するのに十分な詳細がここにあることを願っています.

json の簡略化された内容は次のとおりです。

{
    "locationdetails" : {
        "type": "combobox",
        "default" : "Yellowstone",
        "description" : "Default starting location:",
        "options" : {
            "Death Valley" : "Death Valley",
            "Yellowstone" : "Yellowstone"
        }
    }
}

2 つのメニュー項目 (「Yellowstone」と「Death Valley」) を持つポップアップ メニューが欲しいです。これらのいずれかがクリックされると、コールバック関数を使用して、渡された正しい変数で別の関数を呼び出します (例: 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 つのメニュー項目が作成され、それぞれに正しいラベル (Yellowstone または Death Valley) が付けられている

2)出力は「Yellowstone」と「Death Valley」を正しく出力します

3) ポップアップ メニュー項目をクリックするたびに、[Death Valley] をクリックしてもログに常に [Yellowstone] と出力されます。さらに調査すると、json ファイルの最後のオプションが常に出力されることがわかります。

コードが正しいラベルを持つポップアップ メニュー項目を正しく作成するのに、同じラベルをコールバックに渡さない理由がわかりません。少なくともこれのいくつかが理にかなっていることを願っています!

私は何を間違っていますか?

4

0 に答える 0