Google マップ内にマーカーの情報ウィンドウを作成するために、配列を使用して for ループ内に「使い捨てオブジェクト」を作成しました。ただし、私の方法は機能していないようです。マーカーをクリックしても何も起こりません。コンソールを確認すると、次のエラー メッセージが表示されます。
Uncaught TypeError: Cannot call method 'open' of undefined
オブジェクトを配列インデックスに割り当てない場合、作成されたマーカーのいずれかをクリックすると、最後の情報ウィンドウのみが開きます (つまり、オブジェクトが上書きされると、以前のオブジェクトへのすべての参照が更新されます)。
どうすればこれを回避できますか?
markers = []
infowindows = []
counter = 0
for location in exports.response.locations
myLatlng = new google.maps.LatLng(location.latitude, location.longitude);
markers[counter] = new google.maps.Marker(
position: myLatlng
map: map
title: location.name
)
contentString = '<div id="info_content_' + location.id + '">' + '<h3>' + location.name + '</h3>' + '<ul>' + '<li>' + location.address + ', ' + location.city + '</li>' + '</ul>'
infowindows[counter] = new google.maps.InfoWindow(content: contentString)
google.maps.event.addListener markers[counter], "click", ->
infowindows[counter].open(map, markers[counter])
counter++
ノート
問題の領域は、上記のコードの 3 行目から最後の行です。( infowindows[counter].open(map, markers[counter])
)
答え
この質問への事実上すべての返信が修正を見つけるのに役立ちましたが、記録のために(そして後でこれを準備する人のために)、foreachで解決しました:
markers = []
infowindows = []
exports.response.locations.forEach (location) ->
myLatlng = new google.maps.LatLng(location.latitude, location.longitude);
markers[location.id] = new google.maps.Marker(
position: myLatlng
map: map
title: location.name
)
contentString = '<div id="info_content_' + location.id + '">' + '<h3>' + location.name + '</h3>' + '<ul>' + '<li>' + location.address + ', ' + location.city + '</li>' + '</ul>'
infowindows[location.id] = new google.maps.InfoWindow(content: contentString)
google.maps.event.addListener markers[location.id], "click", ->
infowindows[location.id].open(map, markers[location.id])