Сделать маркер на карте прямой ссылкой на gmaps4rails v2
Вместо того, чтобы показывать информационное окно на Gmaps4Rails v.2, я хочу перейти на URL объекта по клику. Итак, в Gmaps4Rails v.1 это работало так, чтобы добавить дополнительный {link: <path>}
часть к json каждого маркера, а затем установите перенастройку слушателя события.
Это очень похоже на создание прямой ссылки на маркер карты для gmaps4rails, только здесь для Gmaps4Rails v.2 (и поскольку это полное переписывание, я думаю, что лучше в правильном вопросе, чем смешивать код совершенно разных способов сделать это)
Я узнал, что для того, чтобы ввести пользовательский JSON в Gmaps4Rails v2, я должен
@markers = Gmaps4rails.
build_markers(objects) do |object, marker|
marker.lat object.latitude
marker.lng object.longitude
marker.json({link: object_path(object)})
end
и чтобы изменить обработчик событий, я должен добавить этот coffeescript сразу после вызова addMarker:
markers = handler.addMarkers(#{raw @markers.to_json})
_.each markers, (marker) ->
link = < retrieve link from marker somehow?! >
google.maps.event.clearListeners(marker.getServiceObject(), 'click')
google.maps.event.addListener marker.getServiceObject(), "click", ->
window.location = link
return
К сожалению, ссылка json, похоже, не добавлена к маркеру, или к ней нужно обращаться по-другому. Как это должно быть сделано?
1 ответ
@markers включает вашу ссылку. Проблема в том, что addMarkers массово вызывает конструктор Google, который не использует ненужные параметры, поэтому ваша ссылка теряется в каждом цикле JS.
# return array of marker objects
addMarkers: (markers_data, provider_options)->
_.map markers_data, (marker_data)=>
@addMarker marker_data, provider_options
# return marker object
addMarker: (marker_data, provider_options)->
marker = @_builder('Marker').build(marker_data, provider_options, @marker_options)
marker.setMap(@getMap())
@clusterer.addMarker marker
marker
Вы должны создавать индивидуальные маркеры в ERB-цикле каждого цикла и что-то делать со своей ссылкой. Вы также можете воссоздать массив маркеров, если он лучше вписывается в ваш код. Вот пример ниже
markers = []
<% @hash.each do |data| %>
marker = handler.addMarker(<%=raw data.to_json %>)
markers.push(marker)
marker.getServiceObject().addListener('click', function() {
console.log("marker has link <%= data[:link] %>")})
<% end %>
handler.bounds.extendWith(markers);