Google Maps JS API v3: необходим доступ к объекту маркера из обработчика событий - PullRequest
0 голосов
/ 22 декабря 2010

Я создал MapObject, который обрабатывает мои функции Google Mapping. Объект собирает все маркеры на карте в массив. (Я использую библиотеку Prototype JS.) Когда создаются маркеры, их событие Click отображается на функцию в MapObject. Все работает, как и ожидалось, за исключением того, что когда я нахожусь в событии Click, я больше не могу получить доступ к Маркеру, который вызвал событие Если я привяжу маркер к обработчику событий, я не смогу получить доступ к методам и свойствам MapObject. Вот пример кода, чтобы показать, что происходит.

MappingObject = Class.create({
initialize: function()
{
    try
    {
        this.geocoder = new google.maps.Geocoder();
        this.trucks = $A();
        this.truckPic = "Images/TruckIcon.jpg";
    }
    catch (ex)
    {
        this.sendToConsole("FAIL! " + ex.toString());
    }
},

putTruckOnMapWithLatLong: function(latitude, longitude, title)
{
    var marker = this.getNewTruck(this.getNewLatLong(latitude, longitude));
    try
    {
        marker.setTitle(title);
        google.maps.event.addListener(marker, "click",
                                                  this.truckClickHandler);
        this.trucks.push(marker);
    }
    catch (ex)
    {
        this.sendToConsole(ex.toString());
    }
},

truckClickHandler: function(event)
{
    $("dashboardmessage").update(this.getTitle());
    this.setIcon("Images/small_smiley.jpeg");
}})

Функция getNewTruck () просто возвращает объект Google Marker. Проблема в том, что «this» в truckClickHandler может ссылаться на MapObject, но тогда я не могу получить доступ к объекту маркера. Если я свяжу маркерный объект как этот ...

google.maps.event.addListener(marker, "click", this.truckClickHandler.bind(marker));

Тогда я больше не могу получить доступ к функциям в MapObject. Буду признателен за любую помощь, которую смогу получить. Спасибо!

1 Ответ

1 голос
/ 23 декабря 2010

Хорошо, для тех, кто заинтересован, я наконец-то понял это.Прототип имеет метод .curry ().Если я объявлю свой truckClickHandler следующим образом ...

truckClickHandler: function(marker, event)

И затем установлю его следующим образом ...

google.maps.event.addListener(marker, "click", this.truckClickHandler.curry(marker).bind(this));

Тогда у меня будет доступ к обоим объектам маркера, и это относится кмой MapObject, как и ожидалось.Go Prototype!

...