我正在尝试弄清楚如何使用@map_points = @user.places.to_gmaps4rails
将当前位置标记以及后端的一些map_points
添加到gmaps4rails地图中。我看到了以下帖子:
如何在 gmaps4rails 中使用标记显示用户的位置?
并试图在那里实现JavaScript,但它似乎不起作用。我将这段代码添加到我的 javascript 部分,但由于某种原因,回调似乎没有触发:
= gmaps("map_options" => {"detect_location" => true, "center_on_user" => true, "auto_zoom" => false, "zoom" => 12, "auto_adjust" => true, "markers" => {"data" => @map_points}})
:javascript
Gmaps.map.callback = function() {
Gmaps.map.addMarkers({Lat: Gmaps.map.userLocation.lat(), Lng: Gmaps.map.userLocation.lng(), rich_marker: null, marker_picture:""});
}
编辑:这是我现在拥有的,但由于某种原因,addListenerOnce
没有触发:
- content_for :scripts do
:javascript
Gmaps.map.callback = function() {
google.maps.event.addListenerOnce(Gmaps.map.getMapObject(),'idle', function(){
navigator.geolocation.getCurrentPosition(add_map_marker,displayError);
});
};
function add_map_marker(position){
var lat = position.coords.latitude;
var lng = position.coords.longitude;
Gmaps.map.addMarkers([{
"lng": lng,
"lat": lat,
"picture": "http://googlemaps.googlermania.com/google_maps_api_v3/en/Google_Maps_Marker.png",
"width": "37",
"height": "34"
}]);
}
function displayError(error){
alert('There is an error displaying location');
}
您应该使用此处定义的addMarkers
。
您应该将标记的 json 数组作为参数传递,该数组由to_gmaps4rails
生成或具有相同格式。
编辑:
:javascript
Gmaps.map.callback = function() {
Gmaps.map.addMarkers([
{"description": "", "title": "", "sidebar": "", "lng": "", "lat": "", "picture": "", "width": "", "height": ""}
]);
}
如果地图还不存在,请看这里。
您究竟在哪里添加了该代码? 因为我认为没有一些重新加载,例如:
Gmaps.loadMaps();
反正也行不通...为了解决这个问题,我想你必须描述整个路径。你到底是如何加载一切的?如果是标准方式,则需要重新加载地图。
我还建议仔细研究(gmaps4rails来源)
Gmaps4rails::JsBuilder.create_js
方法,如果这是您的默认行为,请尝试使用此自定义注入进行回调开发自己的方法(第 34 行左右)。
另一种方法是调用一些 ajax 并使用 ujs 做:
$('#map').html('<%= escape_javascript( gmaps({:last_map => false}) ) %>');
Gmaps.map = new Gmaps4RailsGoogle();
Gmaps.load_map = function() {
Gmaps.map.map_options.maxZoom = 15;
Gmaps.map.initialize();
Gmaps.map.markers = <%=raw @json %>;
Gmaps.map.create_markers();
Gmaps.map.adjustMapToBounds();
Gmaps.map.callback();
};
Gmaps.loadMaps();