我正在开发一个web应用程序,当一个动作发生时,它将JSON文件加载到leaflet层中。下面的代码使用"let“语句,但是如果它被取出,那么最后一个循环变量会覆盖每一层。
for (var i = 0; i < area_labels.length; i++) {
let label = area_labels[i];
let label_color = String(getColor(label));
let label_name = getReadableName(label);
$.getJSON(`static/shapefiles/FCN_Smoothed/geojson_class_${label}.json`, function(data) {
layer = L.geoJSON(data, {style:{color:`${label_color}`, stroke:false, fillOpacity:0.6}})
lc.addOverlay(layer, label_name);
});
}
从$.ajax函数将area_labels传递给上面的函数,如下所示:
$.ajax({
url: '/get_target_area',
type: 'POST',
dataType:"json",
data: JSON.stringify(payload),
success: function(data) {
...do stuff...
area_labels = data[5];
loadLeafletLayers(area_labels);
}
});
有没有办法在不使用"let“语句的情况下做到这一点?
发布于 2018-06-09 03:10:34
为了在不使用let
(我假设您需要它来支持< IE11)的情况下工作,您将需要在for
循环中使用闭包,以便维护变量的作用域:
for (var i = 0; i < area_labels.length; i++) {
(function(l, l_col, l_name) {
$.getJSON('static/shapefiles/FCN_Smoothed/geojson_class_' + l + '.json', function(data) {
layer = L.geoJSON(data, {
style: {
color: l_col,
stroke: false,
fillOpacity: 0.6
}
})
lc.addOverlay(l, l_name);
});
})(area_labels[i], String(getColor(label)), getReadableName(label));
}
注意,我还删除了模板文字,就好像您需要删除let
关键字以实现浏览器兼容性一样,那么这肯定也不会起作用。
https://stackoverflow.com/questions/50766938
复制相似问题