Клуб API Карт

Определение карты, для которой сработало событие change у объекта map.zoomRange

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

Добрый день.

Используется api версии 2.0

Определяю мин и макс значения коэффициентов масштабирования

Но возник вопрос как в обработчике определить для какой карты сработало событие?

 

map.zoomRange.get(map.getCenter()).then(
     function (zoomRange, err) {
 
      ... Определение карты ????
 
       if (!err) {                   
         minZoom = zoomRange[0];
         maxZoom = zoomRange[1];      
         }
       });

 

например при клике по карте можно использовать e.get('target')

map.events.add('click',
  function (e) { var eMap = e.get('target');
                     eMap. ...  } );

а тут как быть?

 

 



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

слушать событие boundschange на карте

Удалённый пользователь
28 января 2016, 02:30

смысл его слушать?

(к тому же в момент запроса ми/макс оно не сработает, т.е. нет никаких изменений)

да и получится информацию нужно будет внутрь этой функции передавать с помощью глобальной переменной

 

тогда я не понял про какое событие речь?

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

А вообще непонятно что именно вы хотите сделать и зачем

Удалённый пользователь
28 января 2016, 02:30

1. изначально писал про метод get у объекта
map.zoomRange, результат которого объект-promise (фактически событие), вот в результате (в функции) и хотел определить для какой карты возникло событие


2. событие действительно можно слушать, но в данной случае 'change' у объекта zoomRange

map.zoomRange.events.add('change', initZoomRange );

вот только в функции
initZoomRange не получается определить для какого объекта возникло событие.

 если использовать "стандартное" определение

var eMap = e.get('target');

то оно ничяго не дает (результат undefined)

 

Владислав Турман
28 января 2016, 02:30

Вопрос не ясен. как получить карту ? map. - вы же ее события слушаете )

Или я чет не догнал ?

Удалённый пользователь
28 января 2016, 02:30

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

Владислав Турман
28 января 2016, 02:30

А почему обработчик то один ? у каждой карты свое имя. к этому имени и вешаете обработчик ? или я вообще щас не о том =\

Удалённый пользователь
28 января 2016, 02:30

один - чтобы не плодить лишний код

имеется один класс, для работы с картографией

несколько экземпляров класса для работы с несколькими картами

 

вот и нужно внутри обработчика понять какой это класс,

точнее какая карта (отведено для этого поле класса) чтобы именно для этой карты обработать событие

 

ЗЫ есть небольшое описание чуть выше (во втором ответе

проблема ИМХО надуманная.

если у Вас один класс и несколько экземпляров для каждой карты — сохраните ссылку на карту в поле экземпляра и берите ее оттуда.

типа:

 

// конструктор
function MyClass(..., map) {
    ...
    this._map = map;
}
и в одном из методов
MyClass.prototype.getZoomRange = function () {
    this._map.zoomRange.get(this._map.getCenter()).then(ymaps.util.bind(this._onZoomRange, this));
};
MyClass.prototype._onZoomRange = function (zoomRange, err) {
    // тут работаем с картой this._map
};
Удалённый пользователь
28 января 2016, 02:30

для

function MyClass (...., map) {this._map = map;
this.init = function () {
 ... map.zoomRange.events.add('change', initZoomRange ); }
this.initZoomRange = function () { console.log ('для _map = ' + ??? )
}

в функции initZoomRange подобное можно "провернуть"?

так как при срабатывании события в сеё функции this - объект Window, а не экземпляр
MyClass


создавать

 

 

можно

см. документацию, 3-й параметр метода add

ps: 

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

 

Удалённый пользователь
28 января 2016, 02:30

тоочно: add(,,context)

 

ЗЫ context всё равно придётся использовать (иначе в myClass.prototype.getZoomRange this будет ссылка на объект Window)

function myClass (...,map) {

this.map = map;

this.map.zoomRange.events.add('change', this.getZoomRange, this);

}

 

myClass.prototype.getZoomRange = function () {
  this.map.zoomRange.get(this.map.getCenter()).then(ymaps.util.bind(this.onZoomRange, this));
};
myClass .prototype.onZoomRange = function (zoomRange, err) {
  if (!err) {                  
    this.minZoom = zoomRange[0];
    this.maxZoom = zoomRange[1];
    ...
    }
};

 

ЗЫ context всё равно придётся использовать (иначе в myClass.prototype.getZoomRange this будет ссылка на объект Window)

Дело не в контектсте (конечно придется всегда делать bind)

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

Если добавлять в поля экземпляра конструктора, они будут создаваться каждый раз при инстанцировании (лишнее время, ресурсы и память)

 

Поэтому обычно принято в поля экземпляра писать данные присущие только данному экземпляру, например карту (this.map)

А в поля прототипа методы, которые для всех инстансов делают одно и тоже (работают с полями конкретного экземпляра)

Ну вот так, например.

Удалённый пользователь
28 января 2016, 02:30

можно и так

function myClass (...,map) {

  this.map =map;

  this.map.zoomRange.events.add('change', this.initZoomRange, this);

 

  this.initZoomRange = function(e) {          
   this.map.zoomRange.get( this.map.getCenter()).then(
     function (zoomRange, err) {
       var this_ = this.reject;
       if (!err) {
         this_.minZoom = zoomRange[0];
         this_.maxZoom = zoomRange[1];
         this_.DoZoomRangeChange(zoomRange[0], zoomRange[1]); }
       }, this); //
    };

}

 

var this_ = this.reject;