Клуб API Карт

Изменение hint, name, description в результатах геопоиска API 2.0

Пост в архиве.

Добрый день.

Делаю вывод результатов геокодирования из массива:

data = [ 'addr1', 'addr2' ];
name = [ 'name1', 'name2' ];
description = [ 'desr1', 'descr2' ];

for (var i = 0, l = data.length; i < l; i++) {
        var myGeocoder = ymaps.geocode(data[i], {results: 1});
// в этом месте массивы имени и описания доступны
        myGeocoder.then(function (res) {
            var point = res.geoObjects.get(0);
// в этой точке калл-бак функции значение переменной i = последнему в данном случае 2, т.е. невозможно определить какую точку мы сейчас декодируем

// можно, конечно организовать данные по другому и в качестве ключа массивов имен и описаний задать этот самый адрес ...

// задать hint name description
//            point.hint = name[i];
//            point.name = name[i];
//            point.description = description[i];

                    myMap.geoObjects.add(point);

});

На самом деле вопроса два:

1. передача параметров в калл-бак функцию (но это скорее не по API, а по ajax)

2. задание значений hint  name  и description для точки, полученой по результатам геокодирования. То, как показано в кусочке кода не работает. Так работало в API 1

 

Второс тесно переплетается с первым. В API 1 приходилось делать свой обработчик событий, которому значения hint name description я сам передавал в качестве параметров вызова. Можно ли передать параметры для каждой геокодированной точки штатными методами или нужно делать свой обработчик событий?

 

 

 

4 комментария

Переделал скрипт:

 

        for (var i = 0, l = data.length; i < l; i++) {
        var myGeocoder = ymaps.geocode(data[i], {results: 1});

        myGeocoder.then(function (res) {
              eval ('var coordinats = [ ' + res.geoObjects.get(0).geometry.getCoordinates() + ' ] ');
              var point = res.geoObjects.get(0);
                      myPlacemark = new ymaps.Placemark(coordinats, {
//                        // Свойства.
//                        // Текст метки.
                        iconContent: '1' ,
            balloonContentHeader: '+1+',
                        balloonContentBody: '=1=',
            hintContent: '-1-'
                    });
                    // Добавляем метку в коллекцию
            myCollection.add(myPlacemark);
                });

остается вопрос, как вместо строк =1= вставить соответствующие значения из массива?

Пока загнал бэкап функцию в eval и прописал каждой точке в строковой переменной соответствующее значение имени метки, хинта и дескрипшина. Но может можно это сделать не так криво?

 

// в этой точке калл-бак функции значение переменной i = последнему в данном случае 2, т.е. невозможно определить какую точку мы сейчас декодируем

Дело не в ajax

Вы используете ссылку на переменную i в замыкании

и когда отрабатывает обработчик в then (асинхронно) цикл уже завершит свою работу, переменная "i" будет хранить значение полученное при последней итерации (data.length - 1)

Эта проблема решается оборачиванием кода внутри for в self-invoking-function

 

for (var i = 0, l = data.length; i < l; i++) {

(function (index) {
        var myGeocoder = ymaps.geocode(data[index], {results: 1});
// в этом месте массивы имени и описания доступны
        myGeocoder.then(function (res) {
            var point = res.geoObjects.get(0);

            point.hint = name[index];
            point.name = name[index];
            point.description = description[index];

                    myMap.geoObjects.add(point);

    });

}(i));

}

Ваши проблемы может решить класс множественного геокодирования

да, так значительно красивее. Спасибо!