1

我必须加载一个 JS 文件

requirejs([
MyCode/mapview
    ],
    function   () {

});

现在这取决于谷歌地图,就像我一样

require( ["http://maps.google.com/maps/api/js?v=3.2&sensor=false"],
function() {
                var gm = document.createElement('script'); 
                gm.type = 'text/javascript'; gm.async = true;
                gm.src = document.location.protocol + "//maps.google.com/maps/api/js?v=3.2&sensor=false";
                var s = document.getElementsByTagName('script')[0]; 
                s.parentNode.insertBefore(gm, s);
            }
 );

就在那之前,在我的 reuqire js 包含文件中。我已经使用 shim 命令加载其他本地 JS 依赖项,但我对如何将此依赖项(谷歌地图、http 访问文件)分配给我的 MyCode/mapview 感到困惑。

我应该如何在 shim 中执行此操作?并在我加载 mapview.js 之前运行该函数?

requirejs.config({
    shim: 
    {
        'MyCode/mapview': ['????'],         
    }
});

当我收到此错误时,我知道依赖关系,这是一个谷歌地图类型 Uncaught TypeError: Cannot read property 'HYBRID' of undefined

4

1 回答 1

0

这是一个可能有帮助的模块模式。

模块

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-11T02:00:09.433 回答