我正在使用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事件的监听器。我需要以某种方式重置回调吗?我认为它必须在地图加载之前运行,但在这种情况下,我没有重新加载地图,只是替换标记。
答案 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"
> "