Клуб API Карт

Как удалить обработчик событий для конкретного объекта в ObjectManager

Николай Тихонов
21 июня 2017, 01:43

Доброго времени суток.

Подскажите пожалуйста с ещё одной проблемой, которой не получается решить.
Задача простая: После события 'dblclick' на ломанную линию, которая находится в 'ObjectManager' удалить все обработчики событий, но только для указанной линии.

myObjectManager = new ymaps.ObjectManager();

myObjectManager.objects.events.add(['dblclick', 'mouseenter', 'mouseleave'], function(e)
{
	var objectId = e.get('objectId');
	
	switch( e.get('type') )
	{
		case 'dblclick':
		{
			AddID("#routes_road_id", objectId);
			
			myObjectManager.objects.setObjectOptions(objectId,
			{
				strokeColor: "00000088",
				strokeWidth: 7
			});

            // Удалить обработчик всех событий для objectId.
			
			break;
		}
		case 'mouseenter':
		{
			myObjectManager.objects.setObjectOptions(objectId,
			{
				strokeColor: "00FF0088",
				strokeWidth: 7
			});
			
			break;
		}
		case 'mouseleave':
		{
			myObjectManager.objects.setObjectOptions(objectId,
			{
				strokeColor: "FF000088",
				strokeWidth: 7
			});
			
			break;
		}
	}
});

myMap.geoObjects.add(myObjectManager);

И в догонку ещё уточняющий вопрос: Можно-ли хранить в свойствах гео объекта, который находит в 'ObjectManager' свои поля, например name, и как его получить в обработчике события?

12 комментариев
В ОМ делегирование событий через коллекцию и нет обработчиков для конкретных объектов – там и объектов то нет.
Нужно либо проверять objectId либо удалять объект из ОМ (переносить в другой ОМ)


Свои поля хранить можно (и нужно)
Получить через объект-событие
console.log(myObjectManager.objects.getById(objectId).properties);




Николай Тихонов
22 июня 2017, 15:02
dimik,
Прошу прощения что долго не отвечал :(
Про две коллекции это отличная идея, только вопрос, как более грамотно перенести объект из одной коллекции в другую, при этом что-бы все объекты коллекций имели одинаковые настройки (например цвет и толщину линий).
Николай Тихонов,
из одного ОМ удалить, в другой ОМ добавить.
Опции отображения объектов можно установить на уровне ОМ, а не на уровне объектов
Николай Тихонов
22 июня 2017, 19:49
dimik,
Спасибо за ответ.
В целом разобрался и сделал следующим образом:

var objectId = e.get('objectId');
var myObject = my1ObjectManager.objects.getById(objectId);
my1ObjectManager.objects.remove(objectId);
my2ObjectManager.add(myObject);
Но тут возникла другая проблема: У меня при наведении мышки меняется цвет линии, и в момент когда я переношу линию, у неё появляются индивидуальные свойства цвета, которые переопределяют глобальные. Как можно очистить эти свойства при переносе геообъекта?
Николай Тихонов,
переносите только те поля объекта, которые нужны (без options)
Николай Тихонов
23 июня 2017, 16:49
dimik,
К сожалению, я не на столько хороший программист, как может показаться, но я учусь и стараюсь.

Сделал следующим образом https://pastebin.com/5Cc4QcYR, но глючит (иногда некоторые дороги перестают реагировать на события, хотя их цвет не изменился), да и написано крайне коряво...


Пожалуйста, если Вас не затруднит, поправьте этот код до адекватного состояния.
Николай Тихонов,
https://pastebin.com/4hPbGcFg
Николай Тихонов
23 июня 2017, 19:35
dimik,
ого, красиво и понятно. Только вот поля "geoObjectStrokeColor" ввели в ступор... Во всех доках нету упоминания такого поля :(
Николай Тихонов,
Есть
 Опции для одиночных объектов задаются с префиксом geoObject. Список опций указан в описании класса Placemark.
Николай Тихонов
24 июня 2017, 15:59
dimik,
да, это видел, но не понял как можно задать толщину линии у точки, и соответственно у Placemark и geometry.Point свойства StrokeColor нету... Видимо я не умею пользоваться документацией...
Николай Тихонов,
Изначально ОМ поддерживал только метки, потом добавили поддержку других типов, а документацию не обновили.
Должно быть: Список опций указан в описании класса GeoObject.


Спасибо за внимательность, написал документаторам...
Николай Тихонов
24 июня 2017, 17:08
dimik,
Огромное Спасибо Вам за терпение и за помощь. Всё работает как часы.