Клуб API Карт

Полилинии в api 2.0 и их стилизация.

Williams.Smirnov
9 сентября 2013, 14:52

Есть, код. Здесь я пытаюсь каждой линии выставить свой цвет, в зависимости от того, каккой цвет выберет пользователь. Проблема в том, что Цвет выставляется для всех полилиний вместе, а должен для каждой линии свой цвет, и выставляется только для последней добавленной на карту. Помогите пожалуйста разобраться!!!!!

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

Где определен lines и ind?

И непонятно зачем всё так усложнять, из геоколлекции перекладывать в массив.

Судя по описанию, У Вас типичная ошибка начинающих (циклы и замыкания), то что Вы аффектите последний элемент в массиве, значит что индекс берется из замыкания и на момент выставления цвета, он равен длине массива - 1

То есть у меня проблема с циклом? Но он всего один) Какие в нем могут быть проблемы(

Всеволод Шмыров
9 сентября 2013, 17:00
Какое значение переменной ind ?

for(i=0;i

        {

      ind = nums[i]; 

   if(ind)

       {

      

 if(ind < 10)

  ind = "77"+ind;

  console.log(ind);

  

function xmlload (e) {

  //console.log("http://"+ _SERVER+"/get_line.php?route="+nums[i]+"&color="+color[ind]);

  lines[ind] = ymaps.geoXml.load("http://"+ _SERVER+"/get_line.php?route="+nums[i]+"&color="+color[ind]) 

  .then(onGeoXmlLoad);

 

  //clearInterval(interval);

}

 

function onGeoXmlLoad (res) {

   if(res.mapState)

   {

               //Переносим всю коллекцию в массив

               var itemss = [];

               res.geoObjects.each(function (item) { itemss.push(item); });

 

for (var i=0; i

               {

console.log("__________"+color[ind]);

 

                var victor = res.geoObjects.get(i).geometry.getCoordinates();

    

                lines[i] = new ymaps.Polyline(victor, {}, {

                         // Задаем опции геообъекта.

                         strokeColor: "#"+color[ind],// "'"+"#"+color[ind]+"'" ,

                         //Ширину линии.

                         strokeWidth: 4,

                         // Максимально допустимое количество вершин в ломаной.

                         //editorMaxPoints: 500,

});

// console.log(lines);

myMap.geoObjects.add(lines[i]);

 

         }

                

}  

                     

 

}

//console.log(color[ind]); 

    xmlload();

         }

Вот более полный код. В переменной ind хранится номер маршрута.

Всеволод Шмыров
9 сентября 2013, 17:07
Ну все так как сказал бетмен.
Все onGeoXmlLoad сработают значительно позже цикла. На момент их исполнения переменная ind уже будет иметь последнее значение (не считая того, что это строка).

То есть последовательных моих действий какова? Во первых эта должна быть не строкой, а массивом? А вот как сделать что бы сработало раньше цикла? 

Всеволод Шмыров
9 сентября 2013, 17:22
>> Во первых эта должна быть не строкой, а массивом?
Сложно сказать, так как мне неизвестно что такое "color" - массив или хеш ? обращение color[ind] подразумевает обращение по индексу или по ключу ? Может быть и правильно, что это строка.
>> А вот как сделать что бы сработало раньше цикла?
Раньше цикла никак не сработает, так как geoXml.load это асинхронная операция. Данные загружаются с удаленного источника.
Здесь вам помогут замыкания.
http://habrahabr.ru/post/38642/
http://javascript.ru/basic/closure

В обоих случаях ваши вопросы не по работе API, а по основам JS.

Сделал вот так)

function xmlload (e) {

  //console.log("http://"+ _SERVER+"/get_line.php?route="+nums[i]+"&color="+color[ind]);

 var func = function() {lines[ind] = ymaps.geoXml.load("http://"+ _SERVER+"/get_line.php?route="+nums[i]+"&color="+color[ind]) 

  .then(onGeoXmlLoad);}

 return func;

  //clearInterval(interval);

}

Неправильно(((( 

Всеволод Шмыров
9 сентября 2013, 17:37
Простите, но вы не понимаете, что пишите. Если случайно переставлять строчки в коде, то вряд ли что-то дельное выйдет. Прочитайте ссылки, которые я прислал внимательней.

Хорошо=) Я уже завтра продолжу это) Разберусь и т.д. Если, что спрошу=) Хорошо?

У меня эта фигня обновляется постоянно, так как находится в setInterval. В скрипте ColorPicer есть флаг = 1, В данном скрипте, код которого я приводил выше, Проверка на этот флаг. И тогда полилинии заного перерисоваются. Это дополнение суть дела не меняет?