Клуб API Карт

MyMap.controls.add и Uncaught TypeError: Cannot call method 'add' of undefined

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

Здравствуйте. Подскажите пожалуйста в чем совершаю ошибку:

 

Создана карта, к ней добавлены элементы управления:

yMap.controls.add("mapTools");

yMap.controls.add("zoomControl");

 

Я пробую подключить к ней собственный элемент управления, который ниже описан как пустой класс

var PlacemarkMonitor = new PlacemarkMonitor();

yMap.controls.add( PlacemarkMonitor );

 

function PlacemarkMonitor (params) {
   this.getParent = function ()
   {
      return false;
   }
} // PlacemarkMonitor

 

В итоге получаю ошибку

Uncaught TypeError: Cannot call method 'add' of undefined

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

Забыл упомянуть, что ошибка возникает в 

combine.xml:35712

Ну давайте по порядку.
1. Вы добавляете в yMap.controls не экземпляр класса, а функцию-конструктор. Нужно создать объект класса PlacemarkMonitor, и передавать уже его.
2. Ваш класс должен реализовывать интерфейс IControl.
То есть иметь методы setParent и getParent, а также поле events. В документации не указано (мы это поправим), но еще требуется наличие поля options, который является экземпляром option.Manager.

Если вы пропишите все методы и поля у класса, то должно сработать.

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

 

По пункту 1.

На сколько я понимаю я уже передаю объект на yMap.controls, для ясности я переименовал его в PlacemarkMonitorObject. Добавление его выглядит так:


 

var PlacemarkMonitorObject = new PlacemarkMonitor(yMap); 

yMap.controls.add( PlacemarkMonitorObject );

 

 

Пункт 2.

Класс выглядит следующим образом:


function PlacemarkMonitor (option)

{

   var options;

   var events;

 

   

   this.getParent = function(){

   };


   this.setParent = function(parent){

   };

};


Подскажите, желательно с примером кода, как для класса правильно реализовать интерфейс IControl. А также какие значения нужно передавать на объект (экземпляр yMap или что то другое)

 

var options и var events - локальные переменные функции без какого либо типа.

А должны быть полями класса, да еще и четко определенных типов.

попробуйте для начала переписать этот момент как

 

this.events = new ymaps.event.Manager();

this.options = new ymaps.options.Manager();

 

А лучше почитайте как вообще классы в js создаются.

А чем вам не нравится мое объявление класса? :)

Просто для класса PlacemarkMonitor еще есть прототип и много другого кода, который впринципе к делу отношения не имеет, но 

var PlacemarkMonitorObject = new PlacemarkMonitor

определяет PlacemarkMonitorObject как объект получающий все переменные и методы функции (класса)


Прописал events и options, только вот

this.options = new ymaps.option.Manager(); // option, а не options


Ошибка Cannot call method 'add' of undefined исчезла, но при обращении к моему элементу управления:

yMap.PlacemarkMonitorObject.makeupdate();

Получаю ошибку Uncaught TypeError: Cannot call method 'makeupdate' of undefined

Ну и самого yMap.PlacemarkMonitorObject в структуре не видно

Подскажите пожалуйста в чем совершаю ошибку?

 

И должны ли методы getParent и setParent содержать какую либо информацию или они у меня написаны правильно?

по гет - вернуть тот что был set. А по set - истинно добавиться в этого родителя.

yMap.PlacemarkMonitorObject - не появится НИКОГДА.

Это ваша переменная, так к ней и обращайтесь - PlacemarkMonitorObject

>> yMap.PlacemarkMonitorObject - не появится НИКОГДА. Это ваша переменная, так к ней и обращайтесь -

PlacemarkMonitorObject

Если это был сарказм - подскажите почему она не появится как инструмент работы с картой, переменных у меня и так хватает ;)

Спасибо, это именно то, что мне было нужно!