45 votes

Comment charger l'API Google Maps avec RequireJS ?

J'ai du mal à charger l'api gmaps avec requireJS . Voici ce que j'ai essayé :

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) {})

Mais dans le fichier main.js, lorsque j'essaie d'instancier le géocodeur, j'obtiens l'erreur ,,undefined is not a function".

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

Une idée de ce que je pourrais faire de mal ?

0 votes

Y a-t-il des erreurs de réseau ? Est-ce que l'api JS des cartes se charge réellement ?

1 votes

Non, il n'a pas été chargé...

0 votes

Cette réponse pourrait vous aider - stackoverflow.com/questions/6398342/ . Je n'ai pas de clé API donc il se peut que cela ne fonctionne pas complètement pour moi. Il semble que le chargement du Geocoder doit être demandé.

64voto

hjuster Points 1105

J'ai réussi à régler le problème avec la asynchrone plugin.

Voici un exemple rapide :

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 votes

0 votes

Pour moi le point d'arrêt n'a pas atteint le callBack où vous commentez //Google Maps...serait chargé ici.

0 votes

Comment installer le plugin async ?

12voto

hugsbrugs Points 313

Merci à l'utilisateur1706254 pour la documentation officielle : https://github.com/millermedeiros/requirejs-plugins/ J'utilisais le mot clé "define" qui ne fonctionnait pas pour moi, mais "require" fonctionne bien.

Je ne pouvais pas charger directement :

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

Mais l'utilisation de la méthode asynchrone a fonctionné :

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

0 votes

Hm, ça marche pour moi. Le module goog nécessite que 'async' et 'propertyParser' soient définis dans les chemins, exactement comme cela, y compris la casse de camel. BTW, sensor ne fait rien maintenant et peut être laissé de côté.

0 votes

Quelqu'un peut-il obtenir la clé API pour travailler avec cela ? D'après ce que je sais, le plugin ne prend pas en charge l'inclusion d'une clé API dans l'URL. Il n'est pas difficile d'en coder une en dur dans le plugin, mais je pense que c'est manquer le but. Je préfère maintenant utiliser le module asynchrone pour demander l'URL manuellement, car cela vous donne un contrôle total.

5voto

Finesse Points 2058

Vous n'avez pas besoin du plugin asynchrone pour utiliser Google Maps avec require.js. L'objectif peut être atteint en utilisant seulement un simple Cale 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>

4voto

codekipple Points 96

Dans le prolongement de hjuster, voici un exemple rapide de l'utilisation de la fonction asynchrone plugin

https://gist.github.com/millermedeiros/882682

4voto

loleksy Points 71

Il existe également goog (nécessite async et propertyParser), disponible sur github

Exemple d'utilisation de google maps :

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

0 votes

Voici la façon de procéder. Pour moi, cela a fonctionné avec google places sans aucun problème : goog!maps,3,other_params:key=XXX&libraries=places

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X