Клуб API Карт

глюк или фича options

Пост в архиве.
Skoder
23 февраля 2013, 20:00

Интересная реализация установки опций у объектов

var opt = {"preset":"twirl#blueStretchyIcon"};
var obj = new ymaps.Placemark([54.05193128505404,25.12145593374482], {"iconContent":"Метка"},opt);
alert(obj.options.get('preset')); // выведет  twirl#blueStretchyIcon
obj.options.set({'preset':'twirl#greenStretchyIcon'});
alert(obj.options.get('preset')); // выведет  twirl#greenStretchyIcon это нормально 
alert(data.preset); // выведет  twirl#greenStretchyIcon ????

пол дня с этим провозился, самое интересное если создавать группу объектов изменение в любом из них меняет и opt 

6 комментариев

у меня выдает как и должен:

Uncaught ReferenceError: data is not defined

или я что-то недопонял?

Ну и логично что объект "options", который вы передаете третьим параметром в конструктор ymaps.Placemark - передается по ссылке,

а не создается заного с копированием всех полей.

Поэтому при изменении опций меток, изменяется и opt.

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

Наверное, только options не в массив, а скорее словарь (хэш).

Глюком это назвать нельзя, просто по ссылке передается, и очевидно что будет изменяться оригинал. 

Я видимо не шарил никогда один options-объект между несколькими инстансами, поэтому и не сталкивался с этим.

ну да хеш (мне вообще без разницы, я php программист =) ну а по теме мне кажется объект не должен так зависеть от других объектов, чревато. В jquery плагинах опции всегда копируются, замещая собой опции по умолчанию.  

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

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