Вопрос или проблема
Я создаю новый контрол, к которому хочу добавить события. Мой код выглядит так, и он работает
const MyControl = L.Control.extend({
includes: L.Mixin.Events,
initialize: function(options) {
L.Util.setOptions(this, options);
this.on('event', function(evt) {…});
}
}
Но я получаю предупреждения о устаревании в консоли браузера
Устаревшее включение L.Mixin.Events: это свойство будет удалено в будущих релизах, пожалуйста, используйте наследование от L.Evented.
Однако, когда я изменяю код, чтобы включить L.Evented
, возможность событий отсутствует
const MyControl = L.Control.extend({
includes: L.Evented,
initialize: function(options) {
L.Util.setOptions(this, options);
this.on('event', function(evt) {…});
}
}
Ошибка теперь следующая
Uncaught TypeError: this.on is not a function
Так как же мне включить L.Evented
в пользовательский контрол?
Ответ или решение
Вопрос с удалением предупреждения, связанного с L.Mixin.Events
, и наследованием от L.Evented
в Leaflet может показаться сложным, особенно для разработчиков, которые стремятся создать новые элементы управления с поддержкой событий. В этой статье мы рассмотрим, как правильно использовать L.Evented
для добавления событий в пользовательские элементы управления, избегая предупреждений о депрекации.
Проблема
Вы столкнулись с предупреждением о депрекации при использовании L.Mixin.Events
. Когда вы пытаетесь заменить это на L.Evented
, возникает ошибка: Uncaught TypeError: this.on is not a function
. Это происходит потому, что L.Evented
требует определённого подхода к использованию.
Решение
Чтобы правильно интегрировать события в ваш элемент управления, необходимо воспользоваться следующим методом:
- Наследование от
L.Control
: ваш элемент управления уже наследуется отL.Control
. - Расширение функционала через
L.Evented
: нужно явно вызывать конструкторL.Evented
.
Вот как это можно реализовать:
const MyControl = L.Control.extend({
initialize: function(options) {
L.Util.setOptions(this, options);
// Вызов конструктора L.Evented для инициализации событий
L.Evented.call(this);
// Регистрация события
this.on('event', function(evt) {
// Ваш код обработки события
});
}
});
// Не забудьте создать экземпляр вашего элемента управления и добавить его на карту
const myControlInstance = new MyControl();
map.addControl(myControlInstance);
Объяснение кода
-
Наследование: Вы сохраняете расширение от
L.Control
, что позволяет вашему элементу управления интегрироваться с картой Leaflet. -
Инициализация событий:
L.Evented.call(this);
— это вызов конструктора, который инициализирует функционал событий. Это позволяет вашему объекту стать событие-совместимым.
-
Регистрация событий: После вызова конструктора
L.Evented
, функцияthis.on
становится доступной, что позволяет легко подписываться на события.
Заключение
Следуя приведённым рекомендациям, вы сможете успешно убрать предупреждение о депрекации L.Mixin.Events
, а также использовать события в вашем контроле, наследуемом от L.Control
и расширенном с помощью L.Evented
. Это не только решит текущую проблему, но и обеспечит совместимость с будущими версиями библиотеки Leaflet.
При разработке новых функций всегда учитывайте актуальные изменения в документации и следите за обновлениями, чтобы поддерживать ваш код в актуальном состоянии.