您为什么不只使用新标记更新地图?意思是,无需在每次搜索后重新渲染整个地图,只需通过删除所有标记并添加新标记来更新现有地图上的标记。
我尚未验证该方法,但我想它应该可以工作并且效率更高:
创建一个
app/assets/javascript/map.js文件。您可以在此处存储与地图相关的功能。创建一个函数来更新此文件中的地图标记:
map.js
(function() { var __markers; function updateMarkers(map, markersData) { // Remove current markers map.removeMarkers(__markers); // Add each marker to the map according to received data __markers = _.map(markersData, function(markerJSON) { marker = map.addMarker(markerJSON); map.getMap().setZoom(4); // Not sure this should be in this iterator! _.extend(marker, markerJSON); marker.infowindow = new google.maps.InfoWindow({ content: marker.infowindow }); return marker; }); map.bounds.extendWith(__markers); map.fitMapToBounds(); }; // "Publish" our method on window. You should probably have your own namespace window.updateMarkers = updateMarkers;})();此功能可用于初始化地图并进行更新。由于您不会(如果我的回答令人满意)两次渲染地图,因此您可以删除,
_google_map.erb然后将其内容放回
search.html.erb,但是使用我们刚刚创建的功能:
search.html.erb
<div id="map" style='width: 100%; height: 700px;'></div> <!-- Beginning Google maps --><script type="text/javascript" id="map_script"> $(document).ready(function() { mapHandler = Gmaps.build('Google'); mapHandler.buildMap({ provider: {disableDefaultUI: true,mapTypeId: google.maps.MapTypeId.TERRAIN }, internal: {id: 'map'} }, function(){ var markersData = <%= raw @hash.to_json %>; updateMarkers(mapHandler, markersData); }); }); // document ready</script>声明变量时,请 不要忘记var关键字 ,否则它们最终将成为全局变量,这很糟糕^^
请注意,我故意将其保留
mapHandler为全局变量:稍后当有人使用时,您将需要访问处理程序以更新标记搜索。这可能不是理想的事情,但是这个问题不是关于重构代码的,所以让我们保持这种方式。
因此,现在我的解决方案为您带来了一张地图,该地图在页面加载时使用给定的标记进行了初始化。换句话说,什么都没有改变!
但是,现在允许您重复使用此
updateMarkers功能来更改地图上显示的标记。那就是您的
search.js.erb脚本应该执行的操作:
search.js.erb
(function() { var markersData = <%= raw @hash.to_json %>; updateMarkers(mapHandler, markersData);})();而已!希望它将带您进入项目的下一步:)



