Клуб API Карт

индивидуальные иконки для объектов из ymapsml

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

В ymapml элементам коллекции точек привешиваются properties, которые исользуются в шаблоне для балуна, а также я хочу использовать одно из свойств для назначения иконки конкретной метке. Итак, объекты из xml загружены, добавлены к карте, и я пытаюсь изменить иконку метки (это в then):

 

res.mapState.applyToMap(myMap);
myMap.geoObjects.add(res.geoObjects);
myMap.geoObjects.each(function (arr) {
    arr.each(function (o) {
        o.options.set('preset',
            'twirl#redStretchyIcon'
        );
    });
});

 

Всё замечательно, иконка меняется (и также проверил, что properties из xml передались в свойства объекта карты). Но, увы, клик по меткам теперь не открывает балун со старательно приготовленным содержанием. Без  o.options.set('preset', 'twirl#redStretchyIcon') балун работает как надо, но иконки не те...

Где засада?

Добавление. Собственно, засада в том, что опция 'preset' ранее ссылалась на xml, а теперь на стандартное имя, то есть понятие preset включает с себя очень полный set , а именно, не только внешний вид, но и содержание. Что не очень понятно, так как естветсвнно было бы как-то разделить данные и вид.

Таким образом, я делал, конечно, неправильно. А как правильно?

Добавление 2. Нашёл путь, как обмануть, природу  Но всё же хочется знать, какой путь легальный-официальный.

 

myMap.geoObjects.each(function (arr) {
    arr.each(function (o) {
        var content = o.options
            .get(
                'balloonContentBodyLayout'
        );
        o.options.set('preset',
            'twirl#redStretchyIcon'
        );
        o.options.set(
            'balloonContentBodyLayout',
            content);
    });
});

 

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

 http://api.yandex.ru/maps/doc/jsapi/2.x-stable/ref/reference/templateLayoutFactory.xml

 

 // Создание макета для метки.
        myIconLayout = ymaps.templateLayoutFactory.createClass(
           '', {
                build: function () {
                    // необходим вызов родительского метода, чтобы добавить содержимое макета в DOM
                    this.constructor.superclass.build.call(this);
                },

                clear: function () {
                    this.constructor.superclass.clear.call(this);
                }
            });
....
 var placeMarker = new ymaps.Placemark([latitude, longitude], properties, {
            iconLayout: myIconLayout,
           ....
        });

Правильно - указать ключ пресета в тэге parentStyle вашего стиля (наследование)

А сам стиль будет переопределять только шаблон balloonContent-а

Что-то типа такого:

 

             $[name]v>        twirl#redStretchyIconntStyle>            #myBalloonTemplate   

 

Ага, parentStyle работает, спасибо!