1

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])
4

2 に答える 2

2

あなたの問題はcounter、有効なインデックスがもうないことだと思います:

for location in exports.response.locations

    google.maps.event.addListener markers[counter], "click", ->
        infowindows[counter].open(map, markers[counter])

    counter++

counteronClick ハンドラ クロージャでキャプチャされます。

onClick ハンドラーが実行される前に、範囲を超えてインクリメントされます。

これらのハンドラーはすべて、 に対して同じ値を使用することになりますcounter

于 2013-10-08T03:59:18.797 に答える