2015-11-21 25 views
9

Ho riscontrato un problema nel tentativo di distorcere i risultati di un completamento automatico di Google Maps sull'ultimo pin posizionato su una mappa. Sto seguente tutorial del Google qui: https://developers.google.com/maps/documentation/javascript/places-autocomplete#change_search_areaGoogleMaps v3 autocomplete.getBounds() restituisce undefined dopo essere stato impostato

codice mio CoffeeScript è il seguente:

initSearch = -> 
    autocomplete = new (google.maps.places.Autocomplete)(document.getElementById('location-query'), types: [ 'geocode' ]) 
    autocomplete.addListener 'place_changed', -> 
    place = autocomplete.getPlace() 
    addDestination(place, map, insertIndex) #places pin on map 

    console.log 'autocomplete bounds (before): ' + autocomplete.getBounds() 
    #setting bounds around new place 
    biasCircle = new google.maps.Circle 
     center: place.geometry.location 
     radius: 500 #in kilometers 

    autocomplete.setBounds(biasCircle.getBounds()) 
    console.log 'autocomplete bounds (after): ' + autocomplete.getBounds() 

che compila nella seguente javascript:

initSearch = function() { 
    var autocomplete; 
    autocomplete = new google.maps.places.Autocomplete(document.getElementById('location-query'), { 
     types: ['geocode'] 
    }); 
    return autocomplete.addListener('place_changed', function() { 
     var biasCircle; 
     place = autocomplete.getPlace(); 
     addDestination(place, map, insertIndex); 

     console.log('autocomplete bounds (before): ' + autocomplete.getBounds()); 
     biasCircle = new google.maps.Circle({ 
     center: place.geometry.location, 
     radius: 500 
     }); 
     autocomplete.setBounds(biasCircle.getBounds()); 
     return console.log('autocomplete bounds (after): ' + autocomplete.getBounds()); 
    }); 
    }; 

Il perno è posizionato correttamente sul mappa, ma non importa quanti posti aggiungo, il file console.logs restituisce sempre:

autocomplete bounds (before): undefined 
autocomplete bounds (after): ((9.923577823579402, -84.09528446042509), (9.932560976420598, -84.08616473957488)) 

I limiti vengono impostati correttamente (come mostrato dal secondo console.log), ma i risultati non vengono effettivamente distorti e il primo risulta sempre indefinito.

Il banco di prova che stiamo usando per verificare se i risultati sono stati influenzati sono: 1. Digitare 'San Jose' in funzione di completamento automatico (top risultati dovrebbero essere in America) 2. Aggiungi 'Limon, Costa Rica' come indicatore sulla mappa 3. Digitare 'San Jose' in funzione di completamento automatico, alto risultato dovrebbe essere San Jose, Costa Rica

abbiamo pensato che potrebbe essere un problema di scoping, così abbiamo provato window.autocomplete ovunque e aveva ancora lo stesso problema. Abbiamo anche provato a impostare i limiti di completamento automatico in un metodo separato (anziché l'evento place_changed, ma anche questo non ha funzionato).

Grazie in anticipo per il vostro aiuto!

Aggiornamento: Cercando risposta di Cedric Su consiglio di Cedric, sto cercando di impostare i limiti al di fuori della richiamata ascoltatore (metodo viene chiamato dall'interno di chi ascolta), ma sto ancora ricevendo lo stesso problema. Nuovo codice:

#Sets autocomplete bias 
setAutocompleteBias = (place) -> 
    console.log 'autocomplete bounds (before): ' + window.autocomplete.getBounds() 
    #setting bounds around new place 
    biasCircle = new google.maps.Circle 
    center: place.geometry.location 
    radius: 500 #in kilometers 

    window.autocomplete.setBounds(biasCircle.getBounds()) 
    console.log 'autocomplete bounds (after): ' + window.autocomplete.getBounds() 

window.autocomplete = null 
#Autocomplete search box initialization 
initSearch = -> 
    window.autocomplete = new (google.maps.places.Autocomplete)(document.getElementById('location-query'), types: [ 'geocode' ]) 
    #autocomplete.bindTo('bounds', map) 
    window.autocomplete.addListener 'place_changed', -> 
    place = window.autocomplete.getPlace() 

    addDestination(place, map, insertIndex) 

    setAutocompleteBias(place) 

risposta

3

apparire il tuo completamento automatico manca richiesto l'inizializzazione dei limiti sia dalla mappa

initSearch = -> 
    autocomplete = new (google.maps.places.Autocomplete(     
    document.getElementById('location-query'), types: [ 'geocode' ]) 
    autocomplete.bindTo('bounds', map) 
    autocomplete.addListener 'place_changed', -> 
    place = autocomplete.getPlace() 
    addDestination(place, map, insertIndex) #places pin on map 

    console.log 'autocomplete bounds (before): ' + autocomplete.getBounds() 
    #setting bounds around new place 
    biasCircle = new google.maps.Circle 
     center: place.geometry.location 
     radius: 500 #in kilometers 
    autocomplete.setBounds(biasCircle.getBounds()) 
    console.log 'autocomplete bounds (after): ' + autocomplete.getBounds() 

o tramite un percorso specifico

var defaultBounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(-33.8902, 151.1759), 
    new google.maps.LatLng(-33.8474, 151.2631)); 

var input = document.getElementById('searchTextField'); 
var options = { 
    bounds: defaultBounds, 
    types: ['establishment'] 
}; 
autocomplete = new google.maps.places.Autocomplete(input, options); 

link dal tuo tutorial https://developers.google.com/maps/documentation/javascript/places-autocomplete#add_autocomplete

Link dalla documentazione https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete

+0

Grande! Sono stato in grado di ottenere la tua prima soluzione, 'autocomplete.bindTo' funzionante. Tuttavia, questo associa la visualizzazione corrente delle mappe e tenta di associarlo al LAST pin che l'utente ha inserito sulla mappa. La tua seconda soluzione imposta sempre il primo 'console.log' su defaultBounds. Come posso impostare i limiti per il biasCircle dopo ogni volta che il luogo è cambiato? – CHawk

+0

Non sicuro al 100% di ottenere il tuo punto; se imposti i limiti predefiniti, siamo d'accordo che devi farlo fuori dal callback del listener altrimenti, sovrascriverà sempre l'input dell'utente. Oltre a ciò, quando si impostano i limiti da biasCircle, non vedo nulla di sbagliato. –

+0

Ho modificato la mia domanda per includere il mio codice corrente. Ho provato ad impostare i limiti al di fuori del callback del listener, ma sto ricevendo il mio errore originale (non definito con ogni prima chiamata). – CHawk