2016-08-28 3 views
1

У меня проблема с моим кодом в Google maps API v3. Маркеры обновляются каждую минуту (или вручную в любое время). Но я не хочу стирать все маркеры, а затем снова «повторно загружать» маркеры причин, затем «мигать».Действия Javascript в объекте, когда id находится в другом массиве

У меня на нашем сайте много фильтров, которые влияют на маркеры просмотра. Поэтому один раз может быть 5000 маркеров, и после 1 секунды должно быть всего лишь 1

Но как я могу сделать это правильно? Есть моя функция «addMarker».

this.addMarker = function(id, object) 
    { 
     if(typeof object == 'undefined'){ 
      return; 
     } 

     if(!this.markers[id]) 
     { 
      object.marker = new google.maps.Marker({ 
       position: new google.maps.LatLng(object.lat, object.lng), 
       icon: object.image 
      }); 
      if((object.approved == "1" && MapApprovedControl.enabled) || object.approved == "0" && MapUnapprovedControl.enabled){ 
       object.marker.setMap(this.canvas); 
      } 

      this.markers[id] = object; 
     } 
     else 
     { 
      if(this.markers[id].marker.getIcon() != object.image) { 
       this.markers[id].markers.setIcon(object.image); 
      } 

      if(this.markers[id].marker.getMap() == null){ 
       this.markers[id].marker.setMap(this.canvas); 
      } 
     } 

     this.updated.push(id); 
    }; 

В «еще» блок я добавить индекс в массиве, так что я могу узнать, какие данные уже есть и какие маркеры отсутствуют.

this.updated = []; 

    this.update = function() 
    { 
     if(this.updated.length > 0) 
     { 
      $.each(this.markers, function(index) 
      { 
       var exists = false; 
       $.each(map.updated, function(key, value){ 
        if(index == value){ 
         exists = true; 
         return; 
        } 
       }); 

       if(!exists){ 
        map.markers[index].marker.setMap(null); 
       } 
      }); 

      this.updated = []; 
     } 
    }; 

и когда карта обновляется этот случай:

$.getScript('/Of1dPGvNutBUMJdfGSmJKeZwWjR4MGmUVoBDhb9I/pTTegD9WefgHfx7WzNhP', function() { 
       map.update(); 
      }); 

В этом URL просто "addMarker (..); addMarker (...);"

Но это решение неверно. Как только он работает, однажды nope - не уверен, почему: D + медленно.

Так мои вопросы это:

  1. Как правильно обновить маркеры?
  2. Во время обновления у меня есть два цикла, есть ли способ использовать фильтр массива?

Большое спасибо!

EDIT: Я изменил код, удалил бесполезность и переместил «this.updated.push (id)» после условий. Это решило проблему с тем, что иногда это сработало, а иногда и нет. Тем не менее, это остается проблемой с двумя циклами. (Я все еще думаю, что это не так)

EDIT1: ОК, по-прежнему не работает иногда ... Обычно, когда я получаю меньшее количество маркеров, чем раньше.

EDIT2: OK, сценарий (Аякса фрагмент) не загружается иногда (вероятно, кэшируется, ИДК)

EDIT3: Это, вероятно, лучший способ обновить маркеры без 2 циклов

this.update = function() 
{ 
    if(this.updated.length > 0) 
    { 
     $.each(map.markers, function(index){ 
      if($.inArray(index, map.updated) == -1){ 
       map.markers[index].marker.setMap(null); 
      } 
     }); 
     this.updated = []; 
    } 
}; 

Но Я до сих пор не знаю, как загрузить мой JS-файл (если есть много маркеров, поэтому скрипт просто не читает, не пишет никакой ошибки) - pfff Я не получаю его.

EDIT4: Хорошо, это, вероятно, фиксируется путем добавления этого (в АЯКС сниппета - обновление)

<script type="text/javascript"> 
     function load_js() 
     { 
      var head= document.getElementsByTagName('head')[0]; 
      var script= document.createElement('script'); 
      script.type= 'text/javascript'; 
      script.src= '/Of1dPGvNutBUMJdfGSmJKeZwWjR4MGmUVoBDhb9I/pTTegD9WefgHfx7WzNhP'; 
      head.appendChild(script); 
     } 
     load_js(); 
    </script> 

, а также добавление "map.update();" строка после последней строки в файле/Of1dPGvNutBUMJdfGSmJKeZwWjR4MGmUVoBDhb9I/pTTegD9WefgHfx7WzNhP.

Следующая проблема заключается в: нагрузке только маркер, когда они не существует в нашей карте (эй эта тема как частный блокнот, Н)

Ok, его, вероятно, «неразрешимая», и мне нужна сила бога, чтобы быть продолжение ... НО СПАСИБО МНОГО ПОМОЧЬ ВПЕРВЫЕ! :-))

ответ

0

Задумывались ли вы о скрытии маркеров вместо того, чтобы перерисовывать их для каждого фильтра? Отобразите все маркеры, а затем отключите все те, которые не входят в набор фильтров. Это делает ваш код чистым, потому что вам нужно только вывести маркеры один раз.