2011-09-12 6 views
3

私は現在、Googleマップに表示される緯度/経度のリストを取得するためにサーバーにajax呼び出しを行っています。各マーカーにも「クリック」イベントを添付しました。私が扱っているID(​​データベースから)を知るために、マーカーに少し余分なデータを格納できるようにする必要があるということです。フレンドリーな情報を表示するためにTitleプロパティを使用しています。 AJAX、マーカーの作成、およびクリックイベントは正常に動作します。マーカーの余分なデータを保存する正しい方法は何ですか?ここでコードを参照してください:Googleマップのマーカーデータ

$.ajax({ 
    url: "/location/NearbyHotspots", 
    data: { 
     lat: marker.position.lat(), 
     lng: marker.position.lng(), 
     radius: 10 
    }, 
    datatype: "json", 
    type: "POST", 
    success: function (data, status, xhttp) { 
     for (var i = 0; i < data.length; i++) { 
      var loc = new google.maps.LatLng(data[i].Lat, data[i].Long); 
      var newmarker = new google.maps.Marker({ 
       position: loc, 
       draggable: false, 
       map: map, 
       title: data[i].Name 
      }); 

      // This doesn't seem to work 
      newmarker.hotspotid = data[i].ID; 
      google.maps.event.addListener(newmarker, "click", function(mark) { 
       alert(mark.hotspotid); 
      }); 
     } 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     alert(textStatus); 
    } 
}); 

答えて

10

HA!私はそれを考え出した。 "これは"それをやった!

google.maps.event.addListener(newmarker, "click", function(mark) { 
    alert(this.hotspotid); 
}); 
8

私はあなたのアプローチが正しいと思う、それは間違ったイベントハンドラです。あなたのハンドラ

function(mark) { 
    alert(mark.hotspotid); 
} 

mark引数は、あなたが期待するように、マーカーではなく、MouseEventsee the API reference for details)。

これを修正するには、クロージャを使用してマーカーへの参照を渡す必要があります。これはループによって複雑になります。newmarkerへの参照を使用することはできません。これは、ループの最後のマーカを参照するためです。これを修正するにはいくつかの方法がありますが、クリックイベントを別の関数にアタッチするのが最も簡単です:

success: function (data, status, xhttp) { 
    // define a function to attach the click event 
    function attachClickEvent(marker) { 
     google.maps.event.addListener(marker, "click", function() { 
      // the reference to the marker will be saved in the closure 
      alert(marker.hotspotid); 
     }); 
    } 
    for (var i = 0; i < data.length; i++) { 
     var loc = new google.maps.LatLng(data[i].Lat, data[i].Long); 
     var newmarker = new google.maps.Marker({ 
      position: loc, 
      draggable: false, 
      map: map, 
      title: data[i].Name 
     }); 

     newmarker.hotspotid = data[i].ID; 
     attachClickEvent(newmarker); 
    } 
}, 
+0

BTW-このシナリオでは、カスタムデータでマーカーオブジェクトを拡張する必要はもうありません、あなたはデータをattachClickEvent関数に第二のparamを渡すことができます[i]は.ID –

+0

これが受け入れられるべきです回答。それは、OP自身の答えが示唆しているように、未使用のパラメータをハンドラに残すことを伴わないクリーンな方法を提供します。 – tfrascaroli