我不知道在哪里可以找到在单页应用程序上实施google map的最佳实践。目前,我将bellyjs与requirejs结合使用。
首次加载页面时,创建的标记数只有两个。第二次击中同一条路线后,MarkerWithLabel对象的数量是两倍
其他Google Map插件也是如此(请参阅下文)。
我还能做些什么来刷新/处置/销毁JS内存中的那些对象?
更新:这是我启动插件时的代码:
1)我在模块内声明一个全局变量
var $markers = [],
gm = google.maps,
iconWithColor = new google.maps.MarkerImage('./img/marker.svg', null, null, null, new google.maps.Size(25,25));
2)下面的代码在模块内的另一个功能中
var that = this;
require(["markerclusterer","markerwithlabel"], function () {
_.each(coordinates.models, function(val, i) {
var latLng = new gm.LatLng(val.get('in_latitude'), val.get('in_longitude')),
marker = new MarkerWithLabel({
position: latLng,
draggable: false,
raiseOnDrag: true,
map: that.map,
labelContent: val.get('ig_label'),
labelAnchor: new gm.Point(22, 0),
labelClass: 'label',
bgColour: colors,
animation: gm.Animation.DROP,
icon: iconWithColor,
shadow: shadow
});
$markers.push(marker);
gm.event.addListener(marker, 'click', function() {
var new_marker = this;
if(prev_marker) {
if (prev_marker.getAnimation() != null) {
prev_marker.setAnimation(null);
new_marker.setAnimation(gm.Animation.BOUNCE);
prev_marker = new_marker;
}
} else {
new_marker.setAnimation(gm.Animation.BOUNCE);
prev_marker = new_marker;
}
that.map.panTo(latLng);
});
}, this);
});
3)我尝试通过使用处置
if($markers) {
for (var i = 0; i < $markers.length; i++ ) {
//console.log($markers[i]);
$markers[i].setMap(null);
delete $markers[i];
}
$markers = [];
}
if (markerCluster) {
markerCluster.clearMarkers();
markerCluster = null;
}
if($markers) {
for (var i = 0; i < $markers.length; i++ ) {
//console.log($markers[i]);
google.maps.event.clearInstanceListeners($markers[i]);
$markers[i].setMap(null);
delete $markers[i];
}
$markers = [];
}
好的,最后我仅通过销毁监听器来成功减少了数量。希望有帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句