Клуб API Карт

Как создать именованный контрол

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

К дефолтным контролам типа zoomControl/searchControl удобно обращаться с помощью map.controls.get('controlName'). Как можно обращаться таким образом к собственным контролам, добавленным программно?


map.controls.add(new ymaps.control.Button({
  data: {
    image: 'image.png',
    title: 'title'
  }
}));
// ??
var myButton = map.controls.get('myButton');


По-идее в конструктор ymaps.control.Button нужно передовать какой-нибудь параметр типа options.name, но в документации об этом не написано.
Знаю, что можно сохранить результат new ymaps.control.Button в переменную и пользоваться ей, но хочется нативным способом.

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

Это делается через control.Storage

не выходит:


var button = new ymaps.control.Button({
  data: {
    image: 'image.png',
    title: 'title'
  }
});
map.controls.add(button);
ymaps.control.storage.add('myButton', button);
console.log(map.controls.get('myButton')); // undefined

Поскольку я АПИ не пишу, если у меня что-то не выходит, я смотрю на код АПИ в режиме debug – очень помогает.

 

Во-первых, если вы добавляете контрол в хранилище с ключом, в менеджер его надо добавлять тоже по ключу, а не инстанцию.

Во-вторых в хранилище добавляют конструктор контрола, а не экземпляр и это логично, иначе при добалении на карту таких 2-х контролов они будут ссылаться на один и тот же экземпляр.

 

Итого:

 

var MyButton = function () {
    return new ymaps.control.Button({        data: {            image: 'image.png',            title: 'title'        }    });};ymaps.control.storage.add('myButton', MyButton);myMap.controls.add('myButton');console.log(myMap.controls.get('myButton'));

 

 

myMap.controls.add('myButton') не добавляет контрол

Прочитайте что я вам написал выше

 

В хранилище добавляют конструктор контрола, а не экземпляр
да, работает. прошу прощения, что поспешил.
спасибо!