javascript - 具有特定信息模板内容的多个标记

标签 javascript esri arcgis-js-api

当我循环访问地址列表时,我可以很好地绘制所有地址的标记。但是,当我单击任何标记时,信息窗口内容仅显示最后一个标记的数据。我该如何解决这个问题?

JavaScript

var map ={};
map.markers = [];
map.addresses = [
    {
        'line': '2101 K St',        
        'ref_no': '160621-000005'        
    },
    {
        'line': '2131 K St',        
        'ref_no': '170708-000015'        
    },
    {
        'line': '2321 K St',        
        'ref_no': '170707-000028'
    }
];

.
.
.
map.map_object = new Map("esri_map", {
   basemap: "topo",
   center: [<lat>, <lng>],
   zoom: 12
});

var locator = new Locator("http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer");
for(var i = 0; i < map.addresses.length; i++)
{
    var addr = map.addresses[i];
    var params = {
        countryCode: "US",
        maxLocations: 1,
        address: {"SingleLine": addr.line}
    };
    locator.addressToLocations(params, function(candidates){
        locatorDone(candidates, addr);
    });
}

function locatorDone(candidates, addr)
{
    .
    .
    .
    var html = "<h5>"+addr.line+"</h5>";            
    html += "<p>Ref#: "+addr.ref_no+"</p>";
    var infoTemplate = new esri.InfoTemplate(addr.ref_no, html); // <--- Problem lies here
    var graphic = new esri.Graphic(pt, symbol,'',infoTemplate);
    map.map_object.graphics.add(graphic);
    map.markers.push(graphic);
}

P.S: I've solved similar problems (in case of Google Maps API) by using closures. But I'm not sure how to use that in this case.

最佳答案

您可以将 for 循环的内部包装在一个自调用函数中,该函数将提供闭包。像这样的事情:

for(var i = 0; i < map.addresses.length; i++) 
    (function (i) {
        var addr = map.addresses[i];
        var params = {
            countryCode: "US",
            maxLocations: 1,
            address: {"SingleLine": addr.line}
        };
        locator.addressToLocations(params, function(candidates){
            locatorDone(candidates, addr);
        });
    })(i)

这将使 i 成为此代码块的本地代码。现在在您的代码中,所有 addr 都引用最后一个地址,因为当您异步调用 locatorDone 时,for 循环已完成运行。或者,您可以使用 let,如下所示:for (let i = 0; ... 如果您不需要此代码在版本 11 以下的 Internet Explorer 上运行。

关于javascript - 具有特定信息模板内容的多个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47280387/

相关文章:

javascript - Jquery Mobile Datepicker 在滑动时更改月份

javascript - 删除使用 eval 添加的事件监听器

javascript - 我正在尝试使用模板文字在 html 中显示来自 javascript 的文本,但元素未定义,我该怎么办?

xamarin - 适用于 Xamarin 的 ArcGIS 运行时 SDK?

javascript - 为什么 on-change 事件在下拉列表中工作一次?

node.js - 如何在 ReactJs 项目中使用 Esri Arcgis Map?

java - 如何从 JarClassLoader 和 Applet Launcher 调用返回字符串数据的 applet 方法

javascript - ESRI API 中的toolbar.deactivate() 出现问题

javascript - 如何在自定义元素中动态呈现 VueJS 模板

javascript - 如何触发Graphic的点击事件?