область действия переменной маркеров для карт Google (гем gmaps4rails)

Я пытаюсь понять javascript и то, как передаются переменные, но у меня не очень хорошо получается. Я пытаюсь обновить маркеры карты Google с помощью ajax, но ничего не происходит.

Я отправляю форму, которая отправляет некоторые переменные в контроллер. Некоторые вещи обрабатываются, и он отвечает .js на...

find.js.erb

$('#collapseTwo ul').html("<%= j render partial: 'events/sidebar', collection: @events %>");

alert(<%= raw @hash.to_json %>);

clearMarkers();


markers = handler.addMarkers(<%= raw @hash.to_json %>, {
  draggable: false
});

Рендер работает нормально, так что там все работает, но я не могу достать маркеры, чтобы обновить карту. Это оповещение показывает [object Object], так что это, вероятно, правильно, но никаких действий с маркерами.

Я внес некоторые изменения в marker.coffee в виде

clear: ->
  @getServiceObject().setMap(null)

show: ->
  @getServiceObject().setVisible(true)

hide: ->
  @getServiceObject().setVisible(false)

так что clearMarkers(); работает. Это в другом файле, где я храню некоторые другие действия

events.js.coffee

jQuery ->
  ...
  ...

@clearMarkers = ->
  for marker in Gmaps.store.markers
    marker.clear()
  Gmaps.store.markers = []

Итак... Сначала я вызываю карту с помощью...

jQuery ->
  handler = Gmaps.build 'Google'
  handler.buildMap { 
    provider: { 
      minZoom: 3
    }, internal: {id: 'map'} }, ->

      markers = handler.addMarkers( $('#map').data('events'), 
        draggable: false
        flat: false
      )

      #moves map to marker clicked + open infowindow
      $(document).on 'click', '#sideBar li', ->
        markers[$(this).data('marker')].panTo()
        markers[$(this).data('marker')].click()

Эта функция внизу... единственный способ получить доступ к массиву markers состоял в том, что он находился внутри функции handler.buildMap. Итак, должна ли переменная markers быть глобальной? Как еще я могу воздействовать на них?

Кроме того, переменная handler... мне кажется, она должна быть доступна везде. Я попытался вручную поместить @hash в .addMarkers(), но обработчик не построил маркеры.


person Dudo    schedule 01.11.2013    source источник


Ответы (1)


Вам нужен магазин, доступный по всему миру.

Я предлагаю следующее:

Gmaps.store = {}
jQuery ->
  Gmaps.store.handler = Gmaps.build 'Google'
  Gmaps.store.handler.buildMap...
    Gmaps.store.markers = Gmaps.store.handler.addMarkers(...)

Вы также можете получить доступ к переменным в вашем js.erb.

person apneadiving    schedule 04.11.2013
comment
Бум! Ты спасатель жизни. Это отличный способ сохранить переменные, спасибо! И я вижу всю глобальную функцию с определением функции с помощью @clearMarkers = ->. Когда я повторяю один и тот же поиск снова и снова, маркер исчезает и снова возвращается, но если я увеличиваю или уменьшаю масштаб, появляется куча маркеров вокруг того места, где должен быть один... как его копии. Правильно ли выглядит моя функция clear? - person Dudo; 05.11.2013
comment
Я добавил @getServiceObject().serviceObject = null в функцию очистки... то же самое. - person Dudo; 05.11.2013
comment
это другой вопрос, но подсказка: это связано с маркерами сохранения кластеризатора - person apneadiving; 05.11.2013
comment
Понимаю. Я прочитал каждый файл, но ничего не понял. Как мне поговорить с кластеризатором? Это просто MarkerClusterer.clear() или я воздействую на каждый маркер в кластере? Я попробовал предыдущий вариант в файле objects/marker.coffee, и он все очистил, но добавленные маркеры не отображались, пока я не изменил уровень масштабирования. - person Dudo; 06.11.2013
comment
Пожалуйста, задайте новый вопрос - person apneadiving; 06.11.2013