Клуб API Карт

setBounds не отрабатывает при динамической подгрузке данных

marina.d@ivandamari.ru
6 октября 2015, 12:02

Всем привет! Столкнулась с такой проблемой: загружаю данные на карту (и заодно в html страницы, рядом с картой) аяксом, после чего делаю myMap.setBounds(myMap.geoObjects.getBounds()); Но масштабирование не происходит. Пытаюсь выяснить, в чем дело, при помощи отладчика - карта масштабируется. Убираю точку остановки - опять не масштабируется. В итоге подставила костыль в виде setTimeout - вроде все работает. Это нормально или я что-то не так делаю?

Код:

$.getJSON("/getorgs?id=5", function(json) {
    myOrgMap.geoObjects.add(addMarker(json.object.id, json.object.coords, 'item', true));
    for (i = 0; i < json.items.length; i++) {
      var count = json.items[i].result.length;               
      $('.right .ob').css({'background': 'none'});
      $('.right .ob').append('<div class="what" id="cat_'+i+'"><a href="javascript:void(0)" class="sp sdown">'+json.items[i].cat+' ('+count+') &#9660;</a><ul></ul><div class="cb"></div></div>');     
      for(j=0; j<4; j++) {
        if(j >= count) break;
        myOrgMap.geoObjects.add(addOrgMarker(json.items[i].result[j]));
        $('.right .ob #cat_'+i+' ul').append(json.items[i].result[j].line);
      }
      if(count > 4) $('.right .ob #cat_'+i).append('<a href="javascript:void(0)" class="bl sdown">&#9658; Еще '+(count - 4)+' объектов</a>');
    }
    $('.right .ob').append('<div class="cb"></div>');
  });
  setTimeout(function() {
    myOrgMap.setBounds(myOrgMap.geoObjects.getBounds());
    if(myOrgMap.getZoom() > 16) myOrgMap.setZoom(16);
  }, 1000);

 

PS На карту загружаю точку своего объекта + данные из яндекс.справочника

7 комментариев
Подписаться на комментарии к посту

Похоже, та же проблема. С нетерпением жду ответа. http://clubs.ya.ru/mapsapi/60150/60172#reply-mapsapi-60172

Нужна ссылка на страницу с этим кодом

 опция checkZoomRange: true

значит – сходить на сервер и спросить есть ли карта на данном масштабе, т.е. асинхронно

Ваше условие тут выполнится всегда и масштаб поменяется 2 раза.

Из-за этого карта отрисовывается очень долго

      myMap.setBounds(clusterer.getBounds(), {

          checkZoomRange: true

      });   

      if(myMap.getZoom() > 15) myMap.setZoom(15);

 



marina.d@ivandamari.ru
7 октября 2015, 15:28

Спасибо, но вопрос был не об этой карте - тут с областью видимости все ок. Там внизу страницы есть еще одна карта, у нее id=myOrgMap, и там как раз нет checkZoomRange, но с масштабированием проблема.

вы запрашиваете объекты

через

$.getJSON("/getorgs?id="+$('#current').val(), function(json) {

});

А потом сразу делаете

 myOrgMap.setBounds(myOrgMap.geoObjects.getBounds());

 

Очевидно что вот это самая function(json) { ... }, в которой вы создаете и добавляете метки, она не для красоты, а потому что запрос на сервер – асинхронный и тот setBounds что стоит за ним выполнится раньше чем придет ответ и будет вызван код внутри этой функции

Вы выставляете область когда никакие метки еще не добавлены и ответ не получен.

Чтобы работало корректно без костылей с setTimeout перенесите вызов setBounds внуть 

 function(json) { ... },

после создания и добавления всех меток

marina.d@ivandamari.ru
8 октября 2015, 09:07

Спасибо огромное, теперь работает! Действительно, вроде простая вещь, а не додумалась сама...