使用Gmaps4rails gem调用replaceMarkers后,Gmaps.map.callback无法正常工作?

时间:2013-01-31 03:56:36

标签: javascript ruby-on-rails google-maps ruby-on-rails-3.2 gmaps4rails

我正在使用Gmaps4rails并且已经成功地完成了一些工作,但我有点难过。可能是由于我的新手JS技能。我一直试图在各种问题中遵循例子,但我不确定我哪里出错了。

当我的地图加载Gmaps.map.callback工作正常时,Map已加载,我点击一个标记并触发侦听器事件。

在我看来:

<% content_for :scripts do %>
<script type="text/javascript">
Gmaps.map.callback = function(){
  for(var i = 0; i < Gmaps.map.markers.length; i++){
    marker = Gmaps.map.markers[i];
    google.maps.event.addListener(marker.serviceObject, 'click', 
      (function(marker){
        return function(){      
      alert(marker.id);
        }
      })(marker)
   )
 }
}
</script>
<% end %>

这将使用控制器中创建的json中的标记id进行警告。

然后我有一个搜索功能,可以更新地图的位置并替换标记。这是在ajax调用中调用的。所以在控制器.js.erb中我这样做:

Gmaps.map.replaceMarkers(<%= raw @json %>);

一切似乎都很好,我的地图加载了新标记,但偶数监听器不能处理标记。

所以我的问题是,如何让这些新标记拥有click事件的监听器。我需要以某种方式重置回调吗?我认为它必须在地图加载之前运行,但在这种情况下,我没有重新加载地图,只是替换标记。

2 个答案:

答案 0 :(得分:3)

提取您的方法以重复使用它:

Gmaps.map.listen_to_markers = function(markers){
  for(var i = 0; i < markers.length; i++){
    marker = markers[i];
    google.maps.event.addListener(marker.serviceObject, 'click', 
      (function(marker){
        return function(){      
          alert(marker.id);
        }
      })(marker)
   )
 }
}

Gmaps.map.callback = function(){
  Gmaps.map.listen_to_markers(Gmaps.map.markers);
}

每当你更换标记时:

var new_markers = <%= raw @json %>;
Gmaps.map.replaceMarkers(new_markers);
Gmaps.map.listen_to_markers(new_markers);

答案 1 :(得分:0)

放弃“content_for”,“Gmaps.map.callback”等。 将buildMap(<%=raw @hash.to_json %>)保留在您的视图文件中。

在您的coffeescript文件中,在代码行handler.fitMapToBounds();

之后插入您自己的作品

例如,单击导航栏上的项目并触发特定标记上的点击功能以打开信息窗口。

在.html.erb文件中,

a href="javascript:void(0)" class="mapEventName" id="<%= i %>"><%= event.event_name %>

在.js.coffee文件中,

$(".mapEventName").on "click", ->
  i = $(this).attr("id")
  marker = markers[i]
  alert(marker.getServiceObject().getPosition().toString())
  google.maps.event.trigger marker.getServiceObject(), "click"

> "