我正在尝试在for循环中创建一个对象,并在循环中添加一个click函数,它可以调用另一个函数并传入索引 - 这样我就知道它被点击了哪个对象。这是循环:
var markers = [];
for (x = 0; x < response.data.length; x++) {
var ret = {
onClicked: function () { onMarkerClicked(x); },
locationId: response.data[x].CASO_nid,
id: x, //-shows proper index
latitude: response.data[x].Latitude,
longitude: response.data[x].Longitude,
title: x, // shows proper index
showWindow: false,
fit: true
};
markers.push(ret);
}
$scope.results = markers;
现在,当我查看在控制台中创建的对象时,我发现我添加x的每个地方都已正确设置,除了点击功能外,只有x
。问题是,当我在创建它之后单击该对象时,它们都将x
作为它设置的最后一个数字。如何编写此函数以正确获取ndex,而不仅仅是最终的数字??
see in console:
0:
Objectfit:
trueid: 0
idKey: 0
latitude: 42.0230636
locationId:10299
longitude: -87.9620276
onClicked: function () { onMarkerClicked(x); }
showWindow: false
title: 0
答案 0 :(得分:2)
尝试为每个循环创建闭包:
for (index = 0; index < response.data.length; index++) {
(function(x) {
var ret = {
onClicked: function () { onMarkerClicked(x); },
locationId: response.data[x].CASO_nid,
id: x, //-shows proper index
latitude: response.data[x].Latitude,
longitude: response.data[x].Longitude,
title: x, // shows proper index
showWindow: false,
fit: true
};
markers.push(ret);
}(index))
}
另一种使用forEach的解决方案也会产生闭包。
response.data.forEach(function (value, x){
var ret = {
onClicked: function () { onMarkerClicked(x); },
locationId: value.CASO_nid,
id: x, //-shows proper index
latitude: value.Latitude,
longitude: value.Longitude,
title: x, // shows proper index
showWindow: false,
fit: true
};
markers.push(ret);
});