0

我有一个 DownDownButton,它是从包含项目名称和 ID 的数组中填充的。该列表显示项目名称,但我想获取项目 ID。变量“项目”如下所示:

[对象 { name="项目 A", id="1325"}, 对象 { name="项目 B", id="5241"}, 对象 { name="项目 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));
4

2 回答 2

1

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

// 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

于 2013-08-12T22:17:03.533 回答
0

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

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

}

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

于 2013-08-12T22:17:26.093 回答