2013-04-03 9 views
42

Non riesco a caricare gmaps api con requireJS. Questo è quello che ho provato:.Come caricare l'API di Google Maps con RequireJS?

requirejs.config({ 
    urlArgs: "noCache=" + (new Date).getTime(), 
    paths : { 
     "jquery": "vendor/jquery-1.8.2.min", 
     "bootstrap": "vendor/bootstrap.min",  
     "underscore": "libs/underscore-min", 
     "backbone": "libs/backbone-min",  
     "template": "libs/template", 
     "gmaps": "http://maps.google.com/maps/api/js?v=3&sensor=false" 
    }, 
    shim: { 
     'backbone': { 
      deps: ['jquery', 'underscore'], 
      exports: 'Backbone' 
     }, 
     'underscore': { 
      exports: '_' 
     }, 
     'bootstrap': { 
      deps: ['jquery'] 
     }, 
     'gmaps': { 
      deps: ['jquery'] 
     }, 
     'main':{ 
      deps: ['jquery','gmaps'] 
     } 
    } 
}); 

require(["main"], function (main) {}) 

ma dentro main.js quando cerco di istanziare il geocoder ho ottenuto ,, indefinita non è un errore di funzione"

var geocoder = new google.maps.Geocoder(); 

Tutte le idee che cosa potrebbe I fare male

+0

ci sono errori di rete? Le mappe api JS vengono effettivamente caricate? –

+1

Non è stato caricato ... – hjuster

+0

Questa risposta potrebbe aiutare - http://stackoverflow.com/questions/6398342/cant-initiate-the-google-maps-geocoder. Non ho una chiave API, quindi potrebbe non funzionare completamente per me. Sembra che debba essere richiesto il caricamento di Geocoder. –

risposta

63

sono riuscito a risolvere il problema con il plugin async

Un esempio veloce è:?.

require.config({ 
    paths: { 
     'async': 'lib/requirejs-plugins/src/async' 
    } 
}); 

define(['async!http://maps.google.com/maps/api/js?sensor=false'], function() { 
    // Google Maps API and all its dependencies will be loaded here. 
}); 
+7

http://blog.millermedeiros.com/requirejs-2-0-delayed-module-evaluation-and-google-maps/ –

+0

da non confondere con https://github.com/caolan/async – Brett

+0

Per me breakpoint non è riuscito a chiamareBack dove commenta // Google Maps ... verrebbe caricato qui. –

4

C'è anche goog Plugin (richiede asincrona e propertyParser), disponibile sul github

Usage esempio per google maps:

require(["goog!maps,3,other_params:sensor=false"], function(){}); 
+0

Questo è il modo per farlo. Per me ha funzionato con google posti senza problemi: '' 'goog! Maps, 3, other_params: key = XXX & libraries = places''' – sucotronic

12

Grazie a user1706254 causa la documentazione ufficiale: https://github.com/millermedeiros/requirejs-plugins/ utilizzava la parola chiave 'define' che non funzionava per me ma 'require' sta funzionando bene.

non ho potuto caricare direttamente:

require(["goog!maps,3,other_params:sensor=false"], function(){}); 

Ma usando il modo asincrono ha fatto il trucco:

require(['async!http://maps.google.com/maps/api/js?sensor=false'], function(){}); 
+0

Hm, sta funzionando per me. Il modulo goog richiede che 'async' e 'propertyParser' siano definiti nei percorsi, esattamente come questo, incluso l'alloggiamento del cammello. A proposito, il sensore non fa nulla ora e può essere lasciato fuori – light24bulbs

+0

Qualcuno può ottenere la chiave API per lavorare con questo? Per quanto posso dire, questo non supporta l'inclusione di una chiave API nell'URL. Non è difficile limitarsi a codificarne uno nel plugin, ma penso che manchi il punto. Ora preferisco usare il modulo asincrono per richiedere manualmente l'url, poiché ciò ti dà il controllo completo – light24bulbs

0

@ risposta di hjuster mi ha aperto la strada e ho risolto da un callback funzione.

define(['async!http://maps.google.com/maps/api/js?key=YOURKEY!callback'], 
    function (_ExpectedMap) { 
           callback(); 
          }); 

Avviso del ! Richiamata alla fine della URL inizia con asincrono!, viene richiamato il metodo di richiamata al termine dell'operazione di caricamento.

function callback() 
{ 
    //Now load google maps API dependant libraries 
    require(['gmapsLib'], function (googlemaps) { 
        window.GMaps = googlemaps; 
        } 
} 

c'è un altro question Ultimamente ho notato, un'altra funzione (onLoad) è in uso, invece di callback per evitare errore di timeout. Interessante.

-2

non poteva fare il plugin funziona per qualche motivo, ma questa soluzione salvato la mia giornata:

require(['https://apis.google.com/js/client.js?onload=doNothing'], function() { 
    // Poll until gapi is ready 
    function checkGAPI() { 
     if (gapi && gapi.client) { 
     self.init(); 
     } else { 
     setTimeout(checkGAPI, 100); 
     } 
    } 

    checkGAPI(); 
    }); 
}); 

Basta controllare se gapi è pronto ogni 100 millisecondi, fino a quando finalmente carichi.

trovato il codice in questo articolo http://dailyjs.com/2012/12/06/backbone-tutorial-2/

Credo che si può anche provare con

if (google && google.maps && google.maps.Geocoder) { 
    // now google.maps.Geocoder is gonna be defined for sure :) 
} 
1

Non è necessario il plugin asincrona per utilizzare Google Maps con require.js. L'obiettivo può essere raggiunto utilizzando solo un semplice shim config:

require.config({ 
 
    paths: { 
 
     gmaps: '//maps.googleapis.com/maps/api/js?' // question mark is appended to prevent require.js from adding a .js suffix 
 
    }, 
 
    shim: { 
 
     gmaps: { 
 
      exports: 'google.maps' 
 
     } 
 
    } 
 
}); 
 

 
require(['gmaps'], function (gmaps) { 
 
    var center = {lat: -34.397, lng: 150.644}; 
 
    var map = new gmaps.Map(document.getElementById('map'), { 
 
     center: center, 
 
     zoom: 8 
 
    }); 
 
    new gmaps.Marker({ 
 
     map: map, 
 
     position: center 
 
    }); 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.5/require.js"></script> 
 

 
<div id="map" style="width: 100%; height: 200px"></div>