Клуб API Карт

Как задать контекст для значка метки?

alfa2male
22 февраля 2011, 17:58

Привет.

Задать контекст для балуна метки легко:

bl_tpl = new YMaps.Template("hello, $[metaDataProperty.name|мир]!");
st = new YMaps.Style();
st.balloonContentStyle = new YMaps.BalloonContentStyle(bl_tpl);
bp = new YMaps.Placemark(mEvent.getGeoPoint(), {draggable: true, style: st});
  

Но не понимаю, как задать контекст для значка метки?

Пробую так:

// ...тут идёт задание шаблона bp_tpl из предыдущего кода
pm_tpl = new YMaps.Template("я приветствую $[metaDataProperty.name|мир] и тебя!");
//...вставляется в предыдущий код перед созданием метки
st.iconContentStyle = new YMaps.IconContentStyle(pm_tpl);
 

Шаблон отображается, а контекст в него, видимо, не попадает. И какой контекст нужен?

Я даже пробовал сделать pm_tpl.build(bp), но ничего не вышло :(

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

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

Ваш код вывел "я приветствую мир и тебя!".
Вот код, на котором я тестировал:

var bl_tpl = new YMaps.Template("hello, $[metaDataProperty.name|мир]!"),
    pm_tpl = new YMaps.Template("я приветствую $[metaDataProperty.name|мир] и тебя!");

var st = new YMaps.Style();
st.balloonContentStyle = new YMaps.BalloonContentStyle(bl_tpl);
st.iconContentStyle = new YMaps.IconContentStyle(pm_tpl);

var bp = new YMaps.Placemark(map.getCenter(), {draggable: true, style: st});  
map.addOverlay(bp);

Ага, я в курсе. А должен выводить переменную из контекста.

Я ж говорю, что шаблон работает, но контекст не видит :(

По умолчанию используется контекст того объекта, для которого задан стиль.

Вам нужно определить поле, которое вы задаете в шаблоне, например, так:

var bp = new YMaps.Placemark(map.getCenter(), {draggable: true, style: st});·
bp.metaDataProperty = {
    name : "себя" 
}

А лучше изменить шаблон на "я приветствую $[name|мир] и тебя!", тогда задавать можно будет просто name:

bp.name = "себя";
Или вы хотите задавать дополнительный объект-контекст?

да у меня задан объект metaDataProperty.name и данные в нём есть.

я в metaDataProperty пихаю данные, чтобы случайно не случилось пересечения с методами объекта-метки. так безопаснее.

У меня этот контекст работает для балуна, но для значка метки почему-то не пашет :(

не могу понять, где подвох.

Я тут сделал один странный хак и всё сработало, но не пойму, где баг:

bp.setIconContent("");

 

Точнее, есть подозрение, что это именно баг и это просто потому, что у меня в коде сначала создаются стили, точка и вешается на карту, а уже ПОСЛЕ заполняется объект контекста данными.

Получается, что для балуна это не имеет значения и он обновляется динамически, а содержимое метки типа кешируется и обновляется только при вызове метода .setIconContent(); - это баг.

Подскажите, пожалуйста, может я не прав или что-то ещё делаю не так.

Проблема решена, но во избежание, так сказать - хочется знать причины и решение для этой ситуации.

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

я делал апдейт как бешеный хомяк, но толку не было.

сделал .setIconContent("");  и всё сразу сработало :(

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

update помогает, вот пример

YMaps.jQuery(function() {   
    var ymap = new YMaps.Map(document.getElementById("YMapsID"));
    ymap.setCenter(new YMaps.GeoPoint(131.928478, 43.134091), 13);

    var placemark = new YMaps.Placemark(map.getCenter(), {
        style: {
            iconContentStyle : {
                template : new YMaps.Template("$[metaDataProperty.name|Некто]")
            },
            balloonContentStyle : {
                template : new YMaps.Template("$[metaDataProperty.name|Некто]")
            }        }
    });

    // Изменяем поля
    placemark.metaDataProperty = { name : "Тестовое имя" };
    ymap.addOverlay(placemark);

    // Обновляем
    placemark.update();
});
В результате и значке метки, и в балуне будет текст "Тестовая имя".

Ну я пробовал прямо в консоли всё это делать - к сожалению, не получилось апдейтами ничего добиться, чесслово! Я ж пробовал.

Ну да ладно. Хотя, может Вы глянете мой быдлокод и всё сразу станет ясно. Я уже всё перепробовал

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


Также советую воспользоваться советами, приведенными на специальной страничке:

http://clubs.ya.ru/mapsapi/replies.xml?item_no=15143

Окей, спасибо, проверю код.

Отправился читать FAQ.

Комментарий удалён
щас ещё раз потестирую Ваш код. что-то у меня не так :(
а Ваш код работает...
блин, случайно удалил Ваш коммент, уважаемый товарищ модератор. удалял свой, а удалился Ваш :(

Последовательность действий тут насколько важна?

Почему-то у меня в рабочем коде не пашет :(

в общем, недоумеваю, что не так именно с моим кодом?
Дайте ссылку на страницу или полный листинг вашего кода, в котором вы наблюдаете ошибку.
коммент со ссылкой ушёл к Вам в Я.Онлайн

Так как же быть? Вы посмотрели код?

Что в нём не так?

Мне ничего не пришло на мессенджер. Лучше отправьте на почту.
Уже в почте.