Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 映射标记单击目标错误标记_Javascript_Json_Google Maps Api 3_Google Maps Markers_Typescript - Fatal编程技术网

Javascript 映射标记单击目标错误标记

Javascript 映射标记单击目标错误标记,javascript,json,google-maps-api-3,google-maps-markers,typescript,Javascript,Json,Google Maps Api 3,Google Maps Markers,Typescript,因此,我通过一个循环创建了几个GoogleMaps标记,并添加了ClickListener,这应该会打开相应的信息窗口。但是,每次单击标记都会打开上次添加的标记的信息窗口 private loadMarkers():void { net.Ajax.getJson("/locations.json", (response:Location[]) => { for (var i = 0; i < response.length; i++) {

因此,我通过一个循环创建了几个GoogleMaps标记,并添加了ClickListener,这应该会打开相应的信息窗口。但是,每次单击标记都会打开上次添加的标记的信息窗口

private loadMarkers():void {
    net.Ajax.getJson("/locations.json", (response:Location[]) => {
        for (var i = 0; i < response.length; i++) {
            var location:Location = response[i];
            var marker:google.maps.Marker = this.createMarker(location);
            google.maps.event.addListener(marker, 'click', () => {
                this.onMarkerClicked(marker);
            });
        }
    });
}

private onMarkerClicked(marker:google.maps.Marker):void {
    this.infoWindow.close();

    this.infoWindow = new google.maps.InfoWindow({
        content: marker.getTitle()
    });

    this.infoWindow.open(this.map, marker);
}
private loadMarkers():void{
net.Ajax.getJson(“/locations.json”,(响应:Location[])=>{
对于(变量i=0;i{
这个。在市场上点击(标记);
});
}
});
}
私有onMarkerClicked(marker:google.maps.marker):无效{
this.infoWindow.close();
this.infoWindow=new google.maps.infoWindow({
内容:marker.getTitle()
});
this.infoWindow.open(this.map,marker);
}

有什么想法吗?谢谢

这是一个典型的概念错误。闭包捕获变量
标记
而不是其值。由于变量范围是通过
函数
确定的,所以您只有一个
标记

修复:创建一个立即执行的函数(类似于typescript中的模块模式)

net.Ajax.getJson(“/locations.json)”,(响应:Location[])=>{
对于(变量i=0;i{
这个。在市场上点击(标记);
});
})();
}
});
PS:我有一个关于这个主题的视频:

net.Ajax.getJson("/locations.json", (response:Location[]) => {
        for (var i = 0; i < response.length; i++) {
            (function(){
            var location:Location = response[i];
            var marker:google.maps.Marker = this.createMarker(location);
            google.maps.event.addListener(marker, 'click', () => {
                this.onMarkerClicked(marker);
            });
            })();
        }
    });