2013-04-03 13 views
42

私はrequireJSでgmaps apiをロードするのに苦労しています。これは私が試したものです:。RequireJSでGoogle Maps APIを読み込む方法は?

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

しかし、内部main.jsを、私は私が得たジオコーダをインスタンス化しようとすると,,未定義関数」エラーではありません

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

何でし任意のアイデア私が間違ってやっている

+0

を任意のネットワークエラーがありますか? map api JSは実際に読み込んでいますか? –

+1

いいえ、読み込まれていません... – hjuster

+0

この回答は参考になります - http://stackoverflow.com/questions/6398342/cant-initiate-the-google-maps-geocoder私はAPIキーを持っていないので、完全に私のために働くことはできません。ジオコーダーの読み込みを要求する必要があるようです。 –

答えて

63

を私はasyncプラグインでそれを整理して管理している

簡単な例がある:?。

hjusterここに続いて
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

とhttps://github.com/caolan/asyncを混同しないでください – Brett

+0

私のためにブレークポイントあなたがコメントしたコールバックには到達していませんでした// Google Maps ...ここにロードされます。 –

4

の使用方法の簡単な例だgithub

使用上の利用可能、(非同期およびpropertyParserが必要です) Googleマップの例:

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

これはこれを行う方法です。私にとっては、問題なくGoogleの場所で働いた: '' 'goog!maps、3、other_params:key = XXX&libraries = places''' – sucotronic

12

user1706254の公式文書のおかげで、https://github.com/millermedeiros/requirejs-plugins/はキーワード 'define'を使用していましたが、私のためには機能しませんでしたが、 'require'は正常に動作しています。

私が直接読み込むことができませんでした:

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

しかし、非同期の方法を使用してはトリックをした:hjusterの答え@

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

うん、それは私のために働いている。 googモジュールでは、 'async'と 'propertyParser'がラクダのケーシングを含むパスに正確に定義されている必要があります。今のところセンサは何もしておらず、残しておくことができます – light24bulbs

+0

これで動作するAPIキーを誰でも得ることができますか?私が知る限り、これはURLにAPIキーを含めることをサポートしていません。プラグインにハードコードするのは難しいことではありませんが、その点が欠けていると思います。私は今、非同期モジュールを使用してURLを手動で要求することを好みます。これは完全に制御できるためです – light24bulbs

0

は私の道を率いて、私はコールバックすることで解決しました機能

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

お知らせ!URLの末尾にコールバック非同期で始まります!、ロード操作が完了したときにコールバックメソッドが呼び出されています。

​​

は、私が最近気づいた別のquestionあり、他の機能(のonLoad)がタイムアウトエラーを防ぐために代わりにコールバックを使用することです。面白い。

-2

は、プラグインが何らかの理由で動作させることができませんでしたが、この問題を回避するには、私の一日保存:

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(); 
    }); 
}); 

それが最終的にロードされるまでgapiは、すべての100ミリ秒準備ができている場合だけ確認してください。

は、この記事のコードhttp://dailyjs.com/2012/12/06/backbone-tutorial-2/

私はまた、あなたはrequire.jsでGoogleマップを使用するように非同期プラグインを必要としない

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

でそれを試すことができますねを発見しました。目標は単純なshim設定を使用して達成することができます。

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>

関連する問題