我的应用程序在MeteorJS框架上运行并使用谷歌地图(javascript api v3)。 Google地图加载方案类似于此post中解释的方案,它与官方tutorial非常类似。但有时它会加载应用程序抛出重复的异常:
未捕获的TypeError:无法读取属性' lat'为null
下面这段代码导致它(不幸的是,缩小了):
function $H(a, b, c, d) {
var e = c[B], f = new jB(d);
f[p]("title", e);
b[p]("draggableCursor", e, "cursor");
var g = e.Nb;
Q("click dblclick rightclick mouseover mouseout mousemove mousedown mouseup".split(" "), function(d) {
S[z](b, d, function(e, q, s) {
var v = a[Wp](e, !0);
e = new U(v.lat(), v.lng()); //here, v is probably null
})
})
}
我非常确定加载同步问题:a)应用程序运行良好,只在加载的第一秒内抛出错误。 b)这在生产中经常发生,自然加载时间更长。
P.S。如果它可以提供帮助,我可以链接到我的应用程序。
答案 0 :(得分:3)
这就是我在我的应用程序中解决google-maps v3
加载的问题,基本上它涉及在ready
对象上声明一个被动GoogleMaps
方法,一旦我们确定脚本是加载。
client/lib/google-maps.js :
GoogleMaps={
// public methods
config:function(options){
_.extend(this,options);
},
ready:function(){
this._loadingDependency.depend();
return this._ready;
},
// private methods
_loaded:function(){
this._ready=true;
this._loadingDependency.changed();
},
// public members
apiKey:"",
// private members
_ready:false,
_loadingDependency:new Deps.Dependency()
};
_googleMapsLoaded=function(){
GoogleMaps._loaded();
};
Meteor.startup(function(){
if(!GoogleMaps.apiKey){
throw new Meteor.Error(-1,"API key not set, use GoogleMaps.config({apiKey:YOUR_API_KEY});");
}
$.getScript("https://maps.googleapis.com/maps/api/js?key="+GoogleMaps.apiKey+"&callback=_googleMapsLoaded");
});
现在我们可以在ready
模板GoogleMapsView
回调中使用rendered
方法:
client/views/google-maps-view/google-maps-view.js :
<template name="GoogleMapsView">
<div class="google-maps-view"></div>
</template>
Template.GoogleMapsView.rendered=function(){
this.autorun(_.bind(function(){
if(GoogleMaps.ready()){
this.mapOptions={
center:new google.maps.LatLng(48.8582,2.2945),
zoom:15
};
this.map=new google.maps.Map(this.find(".google-maps-view"),this.mapOptions);
}
},this));
};
答案 1 :(得分:0)
初始化函数中存在加载错误的原因。该函数创建了一个没有地图选项的地图,并且在建立与Meteor服务器端的连接时,地图选项被添加到地图中。在地图创建和选项设置之间的时间间隔中,出现错误。课程是:在同一代码段中为创建的地图添加选项。