gmaps4rails的replaceMarkers不工作(javascript)

gmaps4rails replaceMarkers not working (javascript)

本文关键字:javascript 工作 replaceMarkers gmaps4rails      更新时间:2023-09-26

堆栈详细信息ruby 1.9.2p180,rails 3.0.9,gmaps4rails 1.0.2,jquery.json-2.3.min.js

我是gaps4rails的新手,非常喜欢它。到目前为止,一切都很顺利,但我第一次尝试动态更新标记。我在application.js中做了以下操作:

var markers_json = $.toJSON(markers_array);
Gmaps.map.replaceMarkers(markers_json);

这不起作用,并给出以下错误

Uncaught TypeError: Cannot read property 'position' of undefined
extendBoundsWithMarkers in gmaps4rails.googlemaps.js:204
Gmaps4Rails.adjustMapToBounds in gmaps4rails.base.js:443
Gmaps4Rails.create_markers in gmaps4rails.base.js:321
Gmaps4Rails.addMarkers in gmaps4rails.base.js:389
Gmaps4Rails.replaceMarkers in gmaps4rails.base.js:381

调查结果

  1. 确认地图的初始创建是通过提供标记作为json字符串完成的。

  2. 确认我在replaceMarkers调用

  3. 中给出相同格式的json字符串
  4. 确认在源代码中,当addMarkers在初始页面加载时被调用时,标记是一个对象数组的形式,但是replaceMarkers调用(如上所述)包含一个JSON字符串

其他尝试试图传递标记而不转换为JSON

Gmaps.map.replaceMarkers(markers_array);

但是效果不佳

作为JS和Rails的新手,我为此绞尽了脑汁。我无法将控制器中创建的RAILS jSON字符串转换为jSON对象的JavaScript数组。

我尝试只是抓取由_to_gmaps4rails生成的字符串,但它充满了转义字符。我现在知道这是由于Rails的变化,以防止脚本被数据插入。

我尝试了很多东西,比如在浏览器端解析JSON,单独传递数据元素等。

结果是我所需要的是raw()函数,它可以防止字符串被转义。下面是我的工作代码:

in my controller:

@markers = plots.to_gmaps4rails do |plot, marker|
    escaped_comment = ERB::Util.html_escape plot.comment
    marker.infowindow render_to_string(:partial => 'my_partial', :locals => { :plot => plot})
    marker.picture ( {
        "picture" => ActionController::Base.helpers.asset_path(plot.marker) ,          # string,  mandatory
        "width" =>   64,          # integer, mandatory
        "height" => 32,          # integer, mandatory
    })
    marker.title   plot.title
    marker.json({ :id => plot.id, :comment => escaped_comment})
end

在我的JS(从format.js Ajax调用返回):

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

希望这对其他人有帮助!

升级到gmaps4rails 1.3.0即可解决此问题。我面临的另一个问题是确保replaceMarkers方法得到的是一个标记数组,而不是一个JSON字符串

注意,当您创建一个新的地图(在服务器端)时,您必须为标记提供一个JSON字符串。

当你在客户端(在JS中)调用replaceMarkers时,你必须给出一个标记对象数组。