gmaps4rails replaceMarkers не работает (javascript)

#javascript #ruby-on-rails #gmaps4rails

#javascript #ruby-on-rails #gmaps4rails

Вопрос:

сведения о стеке ruby 1.9.2p180, rails 3.0.9, gmaps4rails 1.0.2, jquery.json-2.3.min.js

Предыстория Я новичок в gmaps4rails, и мне действительно нравится gem. Пока все работает хорошо, но я впервые пытаюсь динамически обновлять маркеры. Я делаю следующее в 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);
  

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

Комментарии:

1. да, у меня была ошибка здесь. Обновите до последней версии gem и скажите мне, все ли в порядке.

2. Хорошо, поиграл с этим — сделал эту работу путем обновления до 1.3.0 — Все еще сталкивался с проблемами, когда я передавал строку JSON в replaceMarkers вместо передачи массива объектов.

3. просто нужен массив. [{json_string}, {json_again}] должно быть хорошо.

Ответ №1:

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

Я попытался просто захватить строку, сгенерированную _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 (возвращенном из format.js Вызов Ajax):

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

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

Ответ №2:

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

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

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