2015-01-19 2 views
0

Я испытываю проблему с картами Google api v3. Я пытаюсь масштабировать карту Google, чтобы соответствовать ее маркерам, но, похоже, я не могу получить доступ к некоторым переменным в функции геокодирования.переменный доступ через функцию javascript

function codeAddress(geocoding, address, shop) { 
if (address.length > 0) { 
geocoding.geocode({'address': address}, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     map.setCenter(results[0].geometry.location); 
     marker = new google.maps.Marker({ 
      map: map, 
      position: results[0].geometry.location, 
      icon: createImage("/assets/picto_flag_deepidoo.png"), 
      title: address 
     }); 

     //Setting the lng & lat in an attribute field for a further use 
     shop.setAttribute('lng', marker.getPosition().lng()); 
     shop.setAttribute('lat', marker.getPosition().lat()); 
    } 
    else { 
     alert("Geolocalisation error : " + status); 
    } 
}); 
} 
else { 
    alert("Error : no address"); 
} 
} 

console.log(document.querySelector('#shop0').getAttribute('lng')) //null 
setTimeout(function(){console.log(document.querySelector('#shop0').getAttribute('lng'))},3000) //null & setTimeout does not work 

Проблема в том, что маркер установлен исключительно в геокоде(). Я пробовал обходные пути как доступ к атрибутам «lng» и «lat» с помощью внешней функции, но они не заданы, пока документ не будет полностью загружен. (пробовал с 3000 мс setTimeout, и похоже, что он даже не учитывается)

Как получить доступ к маркеру и его свойствам из геокода и/или как я могу получить лат и lng из полей атрибутов?

EDIT:

Я попробовал несколько способов, и я в настоящее время пытается что-то вроде этого:

function mapBorders(){ 
    var bounds = new google.maps.LatLngBounds(); 
    var countMarkers = "#{@shops.count}"; 
    if (countMarkers > 0) { 
     for (var i = 0; i < countMarkers; i++) { 
     var latlng = document.querySelector('#shop' + i).getAttribute('lat')+","+document.querySelector('#shop' + i).getAttribute('lng'); 
     bounds.extend(new google.maps.LatLng (latlng)); 
     } 
    } 
    return bounds; 
    } 

    map.fitBounds(mapBorders()); 
+1

Поместите свой код, который нуждается в доступе к маркеру в функции, и вызовите его из обратного вызова геокода, передав объект-маркер. –

+0

Геокодирование является асинхронным. Как вы пытаетесь вычислить границы? Как вы пытаетесь использовать эти границы? – geocodezip

+0

@geocodezip, я ответил на мой вопрос. – TazMayhem

ответ

0

Проблема заключается в том, что геокодирования является асинхронным. Код, который вы выполняете вне этой функции, пытается получить доступ к этой информации до ее возврата. Ему нужно дождаться возврата результата из Google, поэтому он принимает функцию обратного вызова в качестве аргумента. Этот код выполняется после ответа на геокодирование.

Вы можете добавить этот код к обратному окну геокода.

Edit:

Вы также можете передать в своей собственной функции для вызова, как уже упоминалось в комментариях выше. Вот некоторые псевдо-код, который должен дать вам некоторое представление:

function codeAddress (geocoding, address, shop, myFunc){ 
    ... 
    geocoding.geocode({'address': address}, function (results, status) { 
     ... 
     //execute my function once the geocoded results are ready, passing it marker. 
     myFunc(marker); 
    }); 
} 

Затем код вызова codeAddress:

codeAddress(geocoding, address, shop, function(marker){ 
    //do some stuff with marker 
}); 

MyFunc затем запускается на выполнение, как только геокодированные результаты будут готовы.

+0

Геокодирование является функцией пустоты и ничего не возвращает https://developers.google.com/maps/documentation/javascript/reference # Geocoder Я уже использую обратный вызов через 'results' – TazMayhem

+0

Это не то, что я говорю ... Ваш результат доступен в анонимной функции, которую вы передали: function (результаты, статус). Цель этого обратного вызова - дождаться готовности результатов, поэтому любой код, который должен ждать этих результатов, должен быть помещен в этот обратный вызов. Другой способ сделать это - следовать совету Felix Kling и передать свою функцию в качестве второго обратного вызова. – JammGamm

0

Проблема решена с помощью глобальной переменной:

var markers_list = new Array();

И функцию под названием внутри Геокодировать:

function createMarkersArray(marker){ markers_list.push(marker); console.log(marker); }

Лат и LNG доступны через простой markers_list[i].getPosition()

bounds.extend(new google.maps.LatLng(markers_list[i].getPosition().lat(), markers_list[i].getPosition().lng()));

map.fitBounds(bounds);

Спасибо за ваши ответы.

Смежные вопросы