Adobe
@Adobe
php developer

Странное поведение карт: Uncaught TypeError: Cannot read property 'geoObjects' of undefined?

Очень странное поведение!

С одними координатами работает, а с несколькими нет ;(

Инициализируем карту:

ymaps.ready(init);
  var myMap;
  function init(){
    myMap = new ymaps.Map("map", {
      center: [56.49540919, 84.95061710],
      zoom: 12,
      controls: ['zoomControl']
    });
  }


Пишем функцию перезагрузки карты (для новых координат, в responseCoords приходят новые координаты. Тут и происходит ошибка). Говорит, что нет myMap (undefined), как это нет, она выше объявлена ;(:
function reloadYandexMap(responseCoords)
  {
    myMap.geoObjects.removeAll();
    for (var i = 0; i < responseCoords.length; i++) {
      myMap.geoObjects.add(new ymaps.Placemark(responseCoords[i]));
    }
    myMap.setBounds(myMap.geoObjects.getBounds());
  }

Отправляем AJAX запрос, для получения новых координат, после того как их получим, сделаем перезагрузку карты:
var responseCoords = [];
  $.ajax({
    type: 'POST',
    url : '/ajax/getCoordsByAddress',
    //async: false,
    data: {
      'arrStreets':  arrStreets
    },
    dataType: 'json',
    success: function(res){
      if(res.success)
      {
        $.each( JSON.parse(res.msg), function( key, val )
        {
          responseCoords.push(val);
        });
        reloadYandexMap(responseCoords);
      }
    }
  });

Когда приходит вот такое дело:
[56.458592, 84.947361]

И происходит ошибка (заголовок топика)

Но! Если приходит вот так:

[56.458537, 84.948367]
[56.49848, 84.968858]
[56.459383, 84.958959]
[56.458592, 84.947361]
[56.510298, 85.029584]
[56.475678, 85.008743]
[56.461153, 84.959003]


То все метки ставятся на карту! Все отлично. Обращаю внимание, что "ошибочные" координаты присутствуют в этом массиве.

Решение:

var myMap;
  function init(){
    myMap = new ymaps.Map("map", {
      center: [56.49540919, 84.95061710],
      zoom: 12,
      controls: ['zoomControl']
    });
  }

  function reloadYandexMap(responseCoords)
  {
    myMap.geoObjects.removeAll();
    for (var i = 0; i < responseCoords.length; i++) {
      myMap.geoObjects.add(new ymaps.Placemark(responseCoords[i]));
    }
    //myMap.setBounds(myMap.geoObjects.getBounds());
  }

  ymaps.ready(function(){
    init();

    var arrStreets = [];
    $('#streets-box span').each(function(ind, val){
      arrStreets.push($(val).text());
    });

    var responseCoords = [];
    $.ajax({
      type: 'POST',
      url : '/ajax/getCoordsByAddress',
      async: false,
      data: {
        'arrStreets':  arrStreets
      },
      dataType: 'json',
      success: function(res){
        if(res.success)
        {
          $.each( JSON.parse(res.msg), function( key, val )
          {
            responseCoords.push(val);
          });
          reloadYandexMap(responseCoords);
        }
      }
    });
  });
  • Вопрос задан
  • 2879 просмотров
Решения вопроса 1
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
ymaps.ready(init);
var myMap;  //myMap = undefined

function init(){
  //Вот это выполнится только по готовности  ymaps
  myMap = new ymaps.Map("map", {
    center: [56.49540919, 84.95061710],
    zoom: 12,
    controls: ['zoomControl']
  });
  console.log(myMap); //ymaps.Map.......
}

//А то, что тут - сразу
console.log(myMap); //undefined
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы