我有一个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));
答案 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));
}
这将创建一个即时评估的匿名函数(具有自己的范围)。