1

因此,我通过循环创建了几个Google地图标记,并添加了应该打开相应infoWindow的点击监听器。然而,每次标记点击都会打开最后添加的标记的infoWindow。地图标记点击目标错误标记

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); 
} 

任何想法?谢谢!

回答

1

这是一个经典的关闭概念错误。闭包捕获变量不是其值。由于变量范围是function,您只有一个。

修复:创建immediately executing function(类似于打印稿中的module pattern)。

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); 
      }); 
      })(); 
     } 
    }); 

PS:我对这个问题的视频:http://www.youtube.com/watch?v=hU4cbxpe49Y&hd=1