5

Jetzt, wo ich einen Weg gefunden habe, Google Maps mit Hilfe von Andy Joslin in diesem SO initialize-google-map-in-angularjs zu initialisieren, suche ich nach einer Möglichkeit, ein Google Map-Objekt asynchron zu laden.Wie man eine google Karte in AngularJS asynchron lädt?

Ich fand ein Beispiel dafür, wie man dies im phonecat Projekt macht.

Beachten Sie, wie die JS-Dateien in diesem Beispiel geladen werden: index-async.html

In meiner Jade Scripts teilweise, die in meinem Programm habe ich versucht, geladen ist:

script(src='js/lib/angular/angular.js') 
script(src='js/lib/script/script.min.js') 

script 
    $script([ 
    'js/lib/angular/angular-resource.min.js', 
    'js/lib/jquery/jquery-1.7.2.min.js', 
    'http://maps.googleapis.com/maps/api/js?key=AIzaSyBTmi_pcXMZtLX5MWFRQgbVEYx-h-pDXO4&sensor=false', 
    'js/app.js', 
    'js/services.js', 
    'js/controllers.js', 
    'js/filters.js', 
    'js/directives.js', 
    'bootstrap/js/bootstrap.min.js' 
    ], function() { 
     // when all is done, execute bootstrap angular application 
     angular.bootstrap(document, ['ofm']); 
    }); 

Wenn ich dies tun, und gehen Sie die laden Karte Seite erhalte ich:

A call to document.write() from an asycrononously-loaded 
external script was ignored. 

Dies wird, wie Google maps jetzt als Dienst geladen wird:

'use strict'; 

var app = angular.module('ofm.services', []); 

app.factory('GoogleMaps', function() { 

    var map_id = '#map'; 
    var lat  = 46.87916; 
    var lng  = -3.32910; 
    var zoom = 15; 
    var map  = initialize(map_id, lat, lng, zoom); 

    return map; 
}); 

function initialize(map_id, lat, lng, zoom) { 
    var myOptions = { 
    zoom : 8, 
    center : new google.maps.LatLng(lat, lng), 
    mapTypeId : google.maps.MapTypeId.ROADMAP 
    }; 
    return new google.maps.Map($(map_id)[0], myOptions); 
} 

Es scheint, dass dies ein Versprechen von dem, was ich mich erinnere, Lesen zurückgeben soll. Aber dieses AngularJS ist sehr neu für mich.

+0

zu Fortschritt vorantreiben Ich habe hier ein git-Projekt erstellt: https://github.com/LarryEitel/angular-google-maps UND habe es hier live gebracht: http://angular-google-maps.nodester.com/. Ich habe hier einen Thread in Google Groups gestartet: https://groups.google.com/forum/?fromgroups&nomobile=true#!topic/angular/CM8ewcWeTF4 –

+0

Wenn Sie die Maps-API-Bibliothek asynchron laden, müssen Sie * eine * bereitstellen Callback-Funktion mit dem Parameter 'callback = 'query. Andernfalls wird der API Loader 'document.write()' verwenden, der von einem asynchronen Aufruf nicht funktioniert. Die Minibibliothek in [GFoley83] (http://stackoverflow.com/a/17396353/1202830) Antwort fügt diesen Parameter für Sie hinzu, weshalb sie in einer asynchronen Ladesituation wie dieser arbeiten kann. –

Antwort

5

Wenn Sie jQuery in Ihrem AngularJS App verwenden, überprüfen Sie diese Funktion aus, die wieder ein promise für, wenn die Google Maps API geladen ist:

https://gist.github.com/gbakernet/828536

Ich konnte dies in einer AngularJS Richtlinie verwenden, um Google Maps bei Bedarf zu laden. Arbeitet ein Genuss:

angular.module('mapModule') // usage: data-google-map 
    .directive('googleMap', ['$window', function ($window) { 
     return { 
      restrict: 'A', 
      link: function (scope, element, attrs) { 
       // If Google maps is already present then just initialise my map 
       if ($window.google && $window.google.maps) { 
        initGoogleMaps(); 
       } else { 
        loadGoogleMapsAsync(); 
       } 

       function loadGoogleMapsAsync() { 
        // loadGoogleMaps() == jQuery function from https://gist.github.com/gbakernet/828536 
        $.when(loadGoogleMaps()) 
         // When Google maps is loaded, add InfoBox - this is optional 
         .then(function() { 
          $.ajax({ url: "/resources/js/infobox.min.js", dataType: "script", async: false }); 
         }) 
         .done(function() { 
          initGoogleMaps(); 
         }); 
       }; 

       function initGoogleMaps() { 
        // Load your Google map stuff here 
        // Remember to wrap scope variables inside `scope.$apply(function(){...});` 
       } 
      } 
     }; 
    }]); 
+9

Eek, gemischt eckig und jQuery! –

+1

@ Rote-Beete-Rote Beete Wette deinen Arsch, den ich tat! Gegenwärtig gibt es keine einfache Möglichkeit, Skripte mit AngularJS zu laden, und das Google Maps API unterstützt nativ keine Versprechungen. Ich habe eine mehr als angemessene Lösung vorgeschlagen; Wenn du einen besseren hast, dann lass es uns sehen! :) – GFoley83

+0

GFoley, ich nehme Ihren Standpunkt und ich habe nicht gesagt, das war nicht rational, ich sagte nur "eek". Ich habe nicht versucht, aber kann AngularJS $ q nicht zwingen jQuery Versprechungen in sein eigenes wie Q.js? Wenn dies der Fall ist, können in 'loadGoogleMapsAsync()' alle außer dem Ausdruck '$ .ajax (...)' mit $ q geschrieben werden, was in einem Angular.js-Modul passender erscheint. –

7

hier ist meine Lösung kam ich ohne mit jQuery: (Gist here)

angular.module('testApp', []). 
    directive('lazyLoad', ['$window', '$q', function ($window, $q) { 
     function load_script() { 
      var s = document.createElement('script'); // use global document since Angular's $document is weak 
      s.src = 'https://maps.googleapis.com/maps/api/js?sensor=false&callback=initialize'; 
      document.body.appendChild(s); 
     } 
     function lazyLoadApi(key) { 
      var deferred = $q.defer(); 
      $window.initialize = function() { 
       deferred.resolve(); 
      }; 
      // thanks to Emil Stenström: http://friendlybit.com/js/lazy-loading-asyncronous-javascript/ 
      if ($window.attachEvent) { 
       $window.attachEvent('onload', load_script); 
      } else { 
       $window.addEventListener('load', load_script, false); 
      } 
      return deferred.promise; 
     } 
     return { 
      restrict: 'E', 
      link: function (scope, element, attrs) { // function content is optional 
      // in this example, it shows how and when the promises are resolved 
       if ($window.google && $window.google.maps) { 
        console.log('gmaps already loaded'); 
       } else { 
        lazyLoadApi().then(function() { 
         console.log('promise resolved'); 
         if ($window.google && $window.google.maps) { 
          console.log('gmaps loaded'); 
         } else { 
          console.log('gmaps not loaded'); 
         } 
        }, function() { 
         console.log('promise rejected'); 
        }); 
       } 
      } 
     }; 
    }]); 
2

einen Blick von dieser i seine denken Nehmen zuverlässiger

var deferred = $q.defer(); 
         var script = document.createElement('script'); 

         $window.initMap = function() { 
          //console.log("Map init "); 

          deferred.resolve(); 
         } 
         script.src = "//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places&callback=initMap"; 
         document.body.appendChild(script); 
         return deferred.promise; 
Verwandte Themen