8

有没有人在 AMD 版本中使用过类似 require.js 的 Googlemaps V3?是否已经在某个地方完成了?

4

4 回答 4

7

在 require.js 你可以使用异步插件,然后像这样调用它:

define([
    'async!http://maps.google.com/maps/api/js?sensor=false'
], function(){
    //Create your map.
});
于 2012-09-29T01:31:27.847 回答
2

您也可以使用 jQuery.Deferred() 和一些全局变量来完成它(不理想,但我需要它,所以我可以使用 grunt rjs 优化我的文件,它不适用于异步):

// gmapsDone.js
window._mapsLoaded = $.Deferred();
window.gmapsLoaded = function(data) {
  delete window.gmapsLoaded;
  _mapsLoaded.resolve();
};

define(["http://maps.google.com/maps/api/js?v=3&sensor=false&callback=gmapsLoaded"], function(gmaps) {
  "use strict";

  return window._mapsLoaded.done;
});

然后,使用它:

define(["gmapsDone"], function(gmapsDone) {
  function load() {
    // Do something
  }
  gmapsDone(load);
});

https://gist.github.com/taktran/5389668

灵感来自http://blog.pixelingene.com/2011/10/using-jquery-dot-deferred-and-requirejs-to-lazy-load-google-maps-api/

于 2013-04-15T17:35:24.667 回答
2

我最近通过使用上述 $.Deferred 方法帮助一位朋友解决了这个问题。这与优化器配合得很好,并且不会导致多个脚本加载。

模块

var google_maps_loaded_def = null;

define(['jquery'],function($) {

  if(!google_maps_loaded_def) {

    google_maps_loaded_def = $.Deferred();

    window.google_maps_loaded = function() {
      google_maps_loaded_def.resolve(google.maps);    
    }

    require(['http://maps.googleapis.com/maps/api/js?sensor=true&callback=google_maps_loaded'],function(){},function(err) {
      google_maps_loaded_def.reject();
      //throw err; // maybe freak out a little?
    });

  }

  return google_maps_loaded_def.promise();

});

可作为要点: https ://gist.github.com/MattSurabian/7868115

用法

要使用上述模块并利用 promise 使用 google.maps 解析的事实:

    define([ 'app/lib/google-maps-loader' ], function(GoogleMapsLoader){
        GoogleMapsLoader.done(function(GoogleMaps){
            // your google maps code here!
            var geocoder = new GoogleMaps.Geocoder();
        }).fail(function(){ 
            console.error("ERROR: Google maps library failed to load");
        });
    });

或者,只需正常引用该google.maps对象

    define([ 'app/lib/google-maps-loader' ], function(GoogleMapsLoader){
        GoogleMapsLoader.done(function(){
            // your google maps code here!
            var geocoder = new google.maps.Geocoder();
        }).fail(function(){ 
            console.error("ERROR: Google maps library failed to load");
        });
    });

我在这里写了一篇关于这个方法的简短博文,可能会有一些用处:RequireJS Projects and Asynchronously Loading the Google Maps API

于 2013-12-09T14:15:34.287 回答
1

我整理了一个Google Maps AMD 加载器插件,它在 async 之上添加了一些功能!装载机。

require.config({
  googlemaps: {
    params: {
      key: 'abcd1234',        // sets api key
      libraries: 'geometry'   // set google libraries
    }
  }
});
require(['googlemaps!'], function(gmaps) {
  // google.maps available as gmaps
  var map = new gmaps.Map('map-canvas');
});
于 2014-01-16T21:39:46.043 回答