Клуб API Карт

Изменение свойств каждого элемента в коллекции

matvei.sheogorath
9 мая 2013, 13:31

как сделать так, чтоб при наведении мыши менялся цвет у полигона, на который она и наведена, а не у последнего созданного?(полигоны выводятся из ymaps.GeoObjectCollection())

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

Что значит у последнего созданного?

Из объекта-события Вы можете получить элемент коллекции на котором произошло событие и поменять его стиль

Вероятно, классическая проблема с замыканиями и циклами.
matvei.sheogorath
9 мая 2013, 13:59

выходит, что при наведении на любой полигон ежели вот так делать

  myCollection.events

            .add("mouseenter", function (e) {

            myCollection.options.set('fillColor', '#ffbc45');

            myCollection.options.set('fillOpacity', '0.5');

        })

        .add("mouseleave", function (e) {

            myCollection.options.set('fillColor', '#E9967A');

            myCollection.options.set('fillOpacity', '0.15');

        }); , то совсем ничего не происходит, а если задавать эти свойства сразу после создания полигона, но перед добавлением его в коллекцию, то подсвечивается только один(уж простите за туманные объяснения)

1. Вы полигоны точно в коллекцию добавили, а не прямо на карту? 

2. Обратите внимание на тип и формат значений опций геообъектов (Вы ошиблись в обоих случаях)

fillColorStringЦвет заливки.

Значение по умолчанию: "0066ff99"

fillOpacityNumberПрозрачность заливки.

Значение по умолчанию: 1

matvei.sheogorath
9 мая 2013, 14:21

1)Вот таким макаром полигоны в коллекцию попадают:

function get_polygon(full_url){

    var placemark,

        geometry_polygon =[] ,

        placemarks = [];

    $.ajax({

        url: full_url,

        data: '',

        type: "post",

        success: function(data){

            if(data.res.length)

            {

                for(i in data.res) {

                    geometry_polygon = data.res[i].fields.polygon_coordinates.value;           

                              value_null = IsStringEmpty(geometry_polygon);

                if(value_null != true){

                   placemark = new ymaps.Polygon(

                        eval(geometry_polygon)

                    ,

                        {    

                        },

                        {

                            fillColor: '#E9967A',

                            strokeColor: '#0000CD',

                            strokeOpacity: 1,

                            strokeWidth: 1,fillOpacity:0.15,

                            gridSize: 100,

                            });

                }

                    placemark.events.add("mouseenter", function (e) {

                        placemark.options.set('fillColor', '00ffbc45');

                        placemark.options.set('fillOpacity', '0.5');

                    })

                    placemark.events.add("mouseleave", function (e) {

                        placemark.options.set('fillColor', '00E9967A');

                        placemark.options.set('fillOpacity', '0.15');

                    })

                    placemarks[i]=placemark;

                    myCollection.add(placemarks[i]);

                        };

              }

            enableForm();

        },

        dataType: "json",

        async: false

    });

}

placemark = new ymaps.Polygon =)))

Вообще что касается терминологии - placemark и Polygon это совсем разные вещи. 

 

Далее:

Если ты задаешь опции цвета линии при создании полигона ему самому, то ты не сможешь их перекрыть опциями коллекции (у них приоритет ниже)

Я так и не понял что ты хочешь сделать. Нужно при наведении на полигон менять цвет ВСЕХ полигонов в коллекции или ТОЛЬКО того на который навели?

matvei.sheogorath
9 мая 2013, 14:30

согласен. название веселое, просто переделывал с точек по аналогии)))

 

только того, на который навели)

 

Кроме того, у тебя тут написан мягко говоря бред.

Как и говорил  у тебя классическая ошибка всех начинающих.

переменная placemark в обработчике события будет указывать на последний добавленный полигон.

Почитай чтоли книжку про javascript

matvei.sheogorath
9 мая 2013, 14:47

дык, это, зелен и молод) только учусь. вот и выходит не все так гладко!

с приоритетами все понял, теперь все нормально работает! вышло так, что я задавал каждому полигону свойства заливки, прозрачности и т.п. 

 

все решило:

 myCollection.events

        .add("mouseenter", function (e) {

            var selected = e.get('target');

            selected.options.set('fillColor', '00ffbc45');



Огромное спасибо за помощь! *ушел нервно читать книжки*)))

Молодец, всё правильно, схватываешь на лету!

Рекомендую Флэнагана или (если слишком много букв) Стефанова

Думаю их можно и на торрентах найти...

matvei.sheogorath
9 мая 2013, 14:57

хм, благодарю)