gmaps4rails replaceMarkers не работает (JavaScript) - PullRequest
1 голос
/ 07 октября 2011

сведения о стеке рубин 1.9.2p180, рельсы 3.0.9, gmaps4rails 1.0.2, jquery.json-2.3.min.js

Фон Я новичок в gmaps4rails и очень люблю этот драгоценный камень. Пока все работает хорошо, но я впервые пытаюсь динамически обновлять маркеры. Я делаю следующее в 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. Подтвердил, что я передаю строку json того же формата в вызове replaceMarkers

  3. Подтверждено, что в исходном коде, когда addMarkers вызывается при начальной загрузке страницы, маркеры имеют вид массива объектов, но вызов replaceMarkers (как я уже упоминал выше) содержит строку JSON

Другие попытки Пытался передать маркеры без конвертации в JSON

Gmaps.map.replaceMarkers(markers_array);

но это не сработало.

Ответы [ 2 ]

2 голосов
/ 31 августа 2012

Я долго ломал голову над этим, будучи новичком как в JS, так и в Rails ... Я не мог сообразить, как преобразовать строку RASON jSON, созданную в моем контроллере, в массив JavaScript JSON-объектов.

Я попытался просто захватить строку, сгенерированную _to_gmaps4rails, но она была полна экранированных символов.Теперь я знаю, что это произошло из-за изменений в Rails, чтобы предотвратить вставку скриптов данными.

Я пробовал много вещей, таких как синтаксический анализ JSON на стороне браузера, индивидуальная передача элементов данных и т. Д.

Оказывается, все, что мне было нужно, это функция raw (), которая предотвращала экранирование строки.Вот мой рабочий код:

в моем контроллере:

@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 (возвращено из вызова Ajax format.js):

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

Надеюсь, это кому-нибудь поможетеще!

1 голос
/ 08 октября 2011

Эта проблема решена путем обновления до gmaps4rails 1.3.0. Другая проблема, с которой я столкнулся, заключалась в том, чтобы убедиться, что для метода replaceMarkers задан массив маркеров, а не строка JSON

Обратите внимание, что при создании новой карты (на стороне сервера) необходимо указать строку JSON для маркеров.

Когда вы вызываете replaceMarkers на стороне клиента (в JS), вы должны предоставить массив объектов-маркеров.

...