如何获取DropDownButton选择的索引(或值)

时间:2013-08-12 22:00:07

标签: javascript dojo

我有一个DownDownButton,我从包含项目名称和ID的数组中填充。该列表显示了项目名称,但我想获得项目ID。变量“projects”看起来像这样:

  

[Object {name =“Project A”,id =“1325”},Object {name =“Project B”,id =“5241”},Object {name =“Project C”,id =“3224” }]

此代码正确创建按钮的MenuItem,但如何在onClick事件中设置变量projId?

for (i = 0; i < projects.length; i++) {
    menuProjects.addChild(new MenuItem({
        label: projects[i].name,
        onClick: function () {
            projId = ?;
        }
   }));
}

我已经尝试过使用“projId = projects [i] .id;”但是这给了我一个错误,因为我现在是3.这样做的正确语法是什么?

- 编辑 -

这就是我使用cookie和Merrick的答案来使用它的方法。

for (i = 0; i < projects.length; i++)
    (function (x) {
        menuProjects.addChild(new MenuItem({
            label: projects[i].name,
            onClick: function () {
                projId = projects[x].id;
            }
        }));
    } (i));

2 个答案:

答案 0 :(得分:1)

因为,onClick回调是异步的,javascript是功能范围的,我将被悬挂,当点击事件发生时,我将是i的最后一个值。为了保持范围,您可以简单地利用IIFE来适当地确定范围。

// Block scoping will all lazily evaluate to 10
for (var i = 0; i < 10; i++) {
  setTimeout(function() {
    console.log(i);
  }, 100);
}


// Block scoping will capture the current value for each function invocation
for (var i = 0; i < 10; i++) (function(i) {
  setTimeout(function() {
    console.log(i);
  }, 100);
})(i)

以下是一个示例:http://jsbin.com/eyeqiy/1/edit

答案 1 :(得分:0)

我不知道这是否是正确/最好的方法,但您可以创建一个闭包,为每个迭代提供一个新的变量范围,如下所示:

for (i = 0; i < projects.length; i++) {
    (function(x) {
        menuProjects.addChild(new MenuItem({
            label: projects[i].name,
            onClick: function () {
                projId = x;
            }
       }));
    }(i));

}

这将创建一个即时评估的匿名函数(具有自己的范围)。