当我有Google Maps API片段时:
<script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"></script>
在中index.html,出现错误:Uncaught InvalidValueError: initMap is not a function。
index.html
Uncaught InvalidValueError: initMap is not a function
我想将所有bower_component,CSS,API和脚本声明保存在index.htmlYeoman支架的AngularJS Web应用程序上的文件中。我实际上试图重新创建的地图将位于另一条路线上,我们称其为“ afterlogin”路线,仅是基本地图。我分开JS和HTML HTML组件成afterlogin.js和afterlogin.html
bower_component
afterlogin.js
afterlogin.html
有很多潜在的原因。此处介绍的其中一项功能是调整调用以匹配名称空间。这需要角度服务吗?如果是这样,该服务将如何initMap在GoogleMaps api代码段的函数及其调用中起作用?
initMap
并发症之一是订购。我是Web应用程序开发人员的新手,但index.html首先我可以告诉负载,它使用代码段中的url回调了该initMap函数,该函数<script>...</script>在index.html文件或app.js文件中均未提供。相反,由于init函数位于路由的js代码中,因此无法看到它,因此需要某种“命名空间”版本的调用。即使从登录路径也将导致控制台错误,甚至在div映射的位置也不会。
<script>...</script>
app.js
div
-—编辑:----
另请注意,在这种情况下,这并没有解决问题:
window.initMap = function(){ //... }
这也并不适用,因为永远不会调用该函数:UncaughtInvalidValueError:initMap不是函数 ------
angular.module('myappproject').controller('AfterloginCtrl', function ($scope) { function initMap() { var map = new google.maps.Map(document.getElementById('map'), { zoom: 17, center: {lat: -33.8666, lng: 151.1958} }); var marker = new google.maps.Marker({ map: map, // Define the place with a location, and a query string. place: { location: {lat: -33.8666, lng: 151.1958}, query: 'Google, Sydney, Australia' }, // Attributions help users find your site again. attribution: { source: 'Google Maps JavaScript API', webUrl: 'https://developers.google.com/maps/' } }); // Construct a new InfoWindow. var infoWindow = new google.maps.InfoWindow({ content: 'Google Sydney' }); // Opens the InfoWindow when marker is clicked. marker.addListener('click', function() { infoWindow.open(map, marker); }); } });
<!DOCTYPE html> <html> <head> <title>after login page</title> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <meta charset="utf-8"> <style> html, body { height: 100%; margin: 0; padding: 0; } #map { height: 100%; } </style> </head> <body> <div id="map"></div> </body> </html>
由于Google Maps SDK脚本加载了同步(由于async属性),因此callbackURL中存在参数。
async
callback
要解决该问题,您需要了解asyncGoogle SDK中的机制
async属性可让浏览器在加载Maps JavaScript API时呈现网站的其余部分。API准备就绪后,它将调用使用callback参数指定的函数。
https://developers.google.com/maps/documentation/javascript/tutorial#Loading_the_Maps_API
因此,解决方案是加载脚本同步:
在加载Maps JavaScript API的脚本代码中,可以省略async属性和callback参数。这将导致在下载API之前,API的加载将被阻止。 这可能会减慢您的页面加载速度。但这意味着您可以假定已加载API来编写后续脚本标签。
在加载Maps JavaScript API的脚本代码中,可以省略async属性和callback参数。这将导致在下载API之前,API的加载将被阻止。
这可能会减慢您的页面加载速度。但这意味着您可以假定已加载API来编写后续脚本标签。
https://developers.google.com/maps/documentation/javascript/tutorial#sync