2012-06-20 9 views
11

Soy loading the google maps API asynchronously lo que le permite definir una devolución de llamada a ejecutar cuando se carga la API. ¿Hay alguna manera de que pueda pasar argumentos a la devolución de llamada?Pasar datos a la devolución de llamada cuando se carga asincrónicamente google maps V3

EDIT:

Aquí está el código que estoy trabajando. Tengo un objeto global llamado master que almacena las siguientes funciones.

/** 
* Load the Google Maps API 
* https://developers.google.com/maps/documentation/javascript/tutorial#Loading_the_Maps_API 
*/ 
loadGoogleMaps: function(){ 
    var googleMaps = document.createElement("script"); 
    googleMaps.type = "text/javascript"; 
    googleMaps.src = "http://maps.googleapis.com/maps/api/js?key=[MYAPIKEY]&sensor=false&callback=master.mapInit"; 
    document.body.appendChild(googleMaps); 
} 

Quiero ser capaz de pasar una serie de lugares en mapInit para que pueda añadir marcadores al mapa cuando se inicializa. También me gustaría poder acceder globalmente a la referencia al mapa para poder modificar el mapa después de su creación.

/** 
* Initialize the map 
*/ 
mapInit: function(){ 

    // Default map options 
    var mapOptions = { 
     zoom: 4, 
     center: new google.maps.LatLng(40, -95), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    // Create map 
    var map = new google.maps.Map(document.getElementById("map"), mapOptions); 

} 

Respuesta

4

terminé trabajando en torno a la necesidad de aprobar argumentos a la devolución de llamada.

Creé un objeto dentro de mi objeto master para contener información sobre un mapa específico. Cada mapa tiene su propia devolución de llamada definida. También contiene la referencia al mapa inicializado y cualquier información adicional específica del mapa que necesita ser referenciada por la devolución de llamada.

/** 
* Map listing 
*/ 
mapList: { 
    mainMap: { 
     map: "", 
     callback: function(){ 

      for(var i = 0, length = this.locations.length; i < length; i++){ 

       master.placeMapMarker(this.locations[i], this); 

      } 

     }, 
     prevInfoWindow: "", 
     locations: {} 
    } 
} 

he modificado la función mapInit para almacenar la referencia al mapa y ejecutar la devolución de llamada en master.mapList.mainMap.

/** 
* Initialize the map 
*/ 
mapInit: function(){ 


    // Default map options 
    var mapOptions = { 
     zoom: 4, 
     center: new google.maps.LatLng(40, -95), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    // Create map 
    var mapName = $("#map").data("name"); 
    var map = this.mapList[mapName].map = new google.maps.Map(document.getElementById("map"), mapOptions); 

    this.mapList[mapName].callback(); 


} 

que almacena el nombre del mapa en un atributo data-name en el elemento marcador de posición para el mapa.

<div id="map" data-name="mainMap"></div> 
3

¿Qué hay de envolver su función en alguna función ficticia que pasa argumentos necesarios como:

function wrapper() 
{ 
    myCallback(arg1, arg2); 
} 

y pasar wrapper() como Google Maps devolución de llamada

+0

Tal vez estoy malentendido, pero estoy tratando de evitar tener diferentes devoluciones de llamada. –

+0

@Bryan Downing: estoy totalmente perdido entonces. Si no necesita crear otra envoltura-devolución de llamada, entonces "NO" no hay forma de pasar argumentos directamente en la url API de google maps – zerkms

+0

Gracias por su respuesta. Básicamente seguí esta ruta, pero no quería tener los argumentos reales dentro de 'wrapper()'. Básicamente hice lo que sugirió, pero almacené algunos de los datos que habría pasado como argumentos sobre el elemento DOM y un objeto separado accesible a nivel mundial. –

Cuestiones relacionadas