Клуб API Карт

Как в IEventManager.add(types, callback, context) использовать «контекст исполнения обработчика»? YMaps 2.0.33

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

Цель - повесить один ивент, к примеру, на кластеризатор и обрабатывать события наведения и ухода курсора с метки внутри него по event.get('target'), не вешая тысячи (x2) обработчиков на все метки коллекции. При этом в кластеризатор в любое время могут догружаться новые метки, требующие авто-подключения обработчика.

 

Используется в оптимизации задачи "подсветить пункт списка рядом с картой при наведении на соответствующую метку", примеров работы с context обнаружить не удалось. Однако, есть предположение, что это нечто подобное селектору в методе JQuery.on(events, selector, data)

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

все согласно документации:

myClusterer.events.add('_event_name_', handler, context);

Да, но что прописать в context? Тип данных - какой-то Object. Это из geometry.type (Point) или ещё какая-то штука, позволяющая отличить точку от кластера? Пример бы... mouseenter на все GeoObject с геометрией 'Point' внутри кластеризатора

Контекст это и есть объект.

Если Вы не используете ООП при программировании,

Вам скорее всего контекст не понадобится.

 

Это произвольный объект в контексте которого будет вызван обработчик события (callback)

Внутри callback к нему можно обратиться через this

Это интерфейсный аналог jQuery.proxy.

Почитайте что-нибудь про data-binding в Javascript

Теперь понятно :) Это просто замена "вызвавшего событие элемента". А есть ли возможность создать один обработчик на всю коллекцию объектов?

Т.е., как в JQuery .on - родительский элемент (кластеризатор) одним событием "наведения курсора" отслеживает, на какой элемент (точку) был наведён курсор и подставляет его в этот контекст.

Таким образом и памяти меньше требуется и процессорное время экономится.

Мой первый ответ на ваш вопрос это и демонстрирует.

элемент, на котором произошло событие будет доступен через e.get('target')

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

    console.log(e.get('target'));

});

Большое спасибо. Хорошо бы в документацию дописать, что Clusterer при назначении ему события mouseenter и т.д. передаёт контекст наведённого элемента. А то в описании только события add/objectsaddtomap/remove и ни слова про такую хитрую и удобную вещь из примера.

Добрый всем. 
ВОт в Jquery реализовано передача параметра в Callback при вызове события. А вот в яндекс мапс как передать параметры? обыскался - не нашел.
Например data='qwerty'; $('selector').on('envent', data, function(e){ console.log( e.data ) })
в яндекс мапс  suggestView.events.add('event',function(e){  /* вот сюда как получить элемент data ???? */   })

не,  канешн я могу попробовать  реализовать через aply или call - но охота как то явно передавать  параметры
alexeyp0708,


Вариант 1. Через контекст (3-й параметр в add)
Вариант 2. Через bind
dimik,
 спасиб. разобрался
alexeyp0708,
 а усе понятн.  suggestView.events.add('event',function(e){ console.log(this) },context)