我正试图使用Google Maps for Rails gem来使用基于使用当前位置的自定义gmaps4rails_callback的标记填充地图,但我似乎无法获得在用户的地理位置确定后替换要触发的标记的代码。
我的application.js
定义了一个自定义映射回调函数,以及getCurrentPosition
:的回调
function nearby_locations(position) {
$.getJSON('locations/nearby.json',
{ lat: "33.7012", long: "-117.8683" },
function(data) {
Gmaps4Rails.replace_markers(data);
});
}
function gmaps4rails_callback() {
navigator.geolocation.getCurrentPosition(nearby_locations);
}
目前,我使用的是硬编码的lat/long数据,但最终我将关闭传递给我的position
对象中的真实数据。手动运行getJSON调用效果良好,我的locations/nearby.json
以正确的格式返回位置数据,并按预期更新标记。
我的视图模板只使用
<%= gmaps("map_options" => {"auto_adjust" => true, "detect_location" => true}) %>
现在我意识到,我可能要做两次地理查找,使用detect_location,然后调用getCurrentPosition
,但在之前的尝试中,gmaps4rails_callback
中的代码在浏览器(Safari)的地理定位权限完成之前就已经执行了,所以我认为这会延迟执行,直到位置确定为止。
我之前显示过一个没有自定义gmaps4rails_callback
的地图,它运行得很好,所以我知道我的jQuery和JavaScript文件被包含得很好。
Google Maps for Rails是否已经建立了自己的getCurrentPosition
回调,而我的回调却被忽略了?添加一些调试日志后,看起来根本不会调用nearby_locations
。
基本上,当您设置"detect_location" => true
时,这会触发以下功能:
findUserLocation: function() {
if(navigator.geolocation) {
//try to retrieve user's position
navigator.geolocation.getCurrentPosition(function(position) {
//saves the position in the userLocation variable
Gmaps4Rails.userLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
//change map's center to focus on user's geoloc if asked
if(Gmaps4Rails.map_options.center_on_user === true) {
Gmaps4Rails.map.setCenter(Gmaps4Rails.userLocation);
}
},
function() {
//if failure, triggers the function if defined
if(this.fnSet("gmaps4rails_geolocation_failure")) { gmaps4rails_geolocation_failure(true); }
});
}
else {
//if failure, triggers the function if defined
if(this.fnSet("gmaps4rails_geolocation_failure")) { gmaps4rails_geolocation_failure(false); }
}
}
所以,是的,地理位置已经确定了。。。或正在进行中。此功能在gmaps4rails_callback
之前被触发,但它是浏览器地理定位的难点:它需要未定义的时间。
我曾考虑过在失败时回调,但认为没有必要在成功时回调(我仍然不相信)。
不幸的是,我不理解你的gmpas4rails_callback
的问题:我有detection_location
和回调,它按预期工作。