Клуб API Карт

как добавить layout в storage?

iytin-ne
14 ноября 2014, 16:16

Здравствуйте. Помогите разобраться, почему не применяется layout для коллекции.

 

  var circleLayout_country = ymaps.templateLayoutFactory.createClass('<div class="placemark_layout_container"><div class="circle_layout country">$[properties.count]</div></div>');

        ymaps.layout.storage.add('country#norm', circleLayout_country);

        countryCollection = new ymaps.GeoObjectCollection(null, {

                preset: 'country#norm'

            }

        );

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

Вы путаете хранилище макетов и опций

В хранилище опций надо передавать объект с ключами имен опций, вот пример. Макетное хранилище позволяет использовать ключи вместо инстанций макетов в значениях имен опций

если не против я опишу задачу и то что у меня получается.

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

Я сделал layout    var circleLayout_country = ymaps.templateLayoutFactory.createClass('$[properties.count]');

и layout при наведении         var circleLayout_country_hover = ymaps.templateLayoutFactory.createClass('$[properties.count]');

потом
  // Помещаем созданные шаблоны в хранилище шаблонов.
        ymaps.layout.storage.add('country#norm', circleLayout_country);
        ymaps.layout.storage.add('country#hover', circleLayout_country_hover);
и вот тут начинаются проблемы у меня
   var countryCollection = new ymaps.GeoObjectCollection(null, {
                iconLayout: 'country#norm'
            }, {
                iconShape: {
                    type: 'Circle',
                    // Круг описывается в виде центра и радиуса
                    coordinates: [0, 0],
                    radius: 27
                }
            }
        );

        countryCollection.events
            .add('click', function (e) {
                var placemark = e.get('target');
                alert('country');
                console.log('country');
            })
            .add('mouseenter', function (e) {
                e.get('target').options.unset('country#norm');
                e.get('target').options.set('country#hover');
            })
            .add('mouseleave', function (e) {
                e.get('target').options.set('country#norm');
                e.get('target').options.unset('country#hover');
            });
сама метка создается вот так   myPlacemark = new ymaps.Placemark([55.4046, 37.88628], {
            count: 'city'
        });

порекомендуйте, как правильно сделать вот этот эффект ховера, куда идти и что читать)

Разница в синтаксисе будет лишь в следующем:

С хранилищем опций:

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

    e.get('target').options.set('preset', 'country#hover');

}).add('mouseleave', function(e) {

    e.get('target').options.set('preset', 'country#norm');

});

 

c хранилищем макетов:

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

    e.get('target').options.set('iconLayout', 'country#hover');

}).add('mouseleave', function(e) {

    e.get('target').options.set('iconLayout', 'country#norm');

});

Пресеты удобны когда вам надо менять несколько макетов за раз (собственно для этого они и сделаны)Вы можете поменять одно свойство "preset" вместо нескольких опций.Если надо менять одну опцию (iconLayout) смысла класть ее в пресет я не вижу, хотя можно и так сделать.
спасибо, все получилось, единственное хотел еще спросить о
iconShape: {
                type: 'Circle',
                    // Круг описывается в виде центра и радиуса
                    coordinates: [0, 0],
                    radius: 27
            }
это можно указывать в коллекции, или нужно только для меток прописывать?

думаю можно.

попробуйте )