Сделать маркер на карте прямой ссылкой на 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);
Другие вопросы по тегам