我正在努力用requireJS加载gmaps 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中,undefined不是函数“错误。
var geocoder = new google.maps.Geocoder();
任何想法我可能做错了什么?
答案 0 :(得分:64)
我已设法使用async插件对其进行排序。
一个简单的例子是:
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.
});
答案 1 :(得分:12)
感谢user1706254导致官方文档:https://github.com/millermedeiros/requirejs-plugins/正在使用关键字' define'那不是为我工作但是需要'工作正常。
我无法直接加载:
require(["goog!maps,3,other_params:sensor=false"], function(){});
但是使用异步方式可以解决问题:
require(['async!http://maps.google.com/maps/api/js?sensor=false'], function(){});
答案 2 :(得分:4)
继hjuster之后,这是一个如何使用async插件的快速示例
答案 3 :(得分:4)
还有goog
插件(需要async和propertyParser),可在github上找到
Google地图的使用示例:
require(["goog!maps,3,other_params:sensor=false"], function(){});
答案 4 :(得分:4)
您不需要使用async插件将Google地图与require.js一起使用。只需使用简单的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>
答案 5 :(得分:0)
@ hjuster的回答引领我,我通过回调函数解决了这个问题。
define(['async!http://maps.google.com/maps/api/js?key=YOURKEY!callback'],
function (_ExpectedMap) {
callback();
});
请注意,网址末尾的!callback 以 async!开头,加载操作完成时会调用回调方法。
function callback()
{
//Now load google maps API dependant libraries
require(['gmapsLib'], function (googlemaps) {
window.GMaps = googlemaps;
}
}
我最近注意到另一个question,正在使用另一个函数(onLoad)而不是回调来防止超时错误。有趣。
答案 6 :(得分:-3)
由于某些原因无法使插件正常工作,但这种解决方法节省了我的一天:
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/
我想你也可以尝试
if (google && google.maps && google.maps.Geocoder) {
// now google.maps.Geocoder is gonna be defined for sure :)
}