Я создаю приложение на AngularJS, которое использует LeafletJS для взаимодействия с картой, предлагая различные возможные взаимодействия, разделенные на то, что я называю фазами. Для каждой из этих фаз существует состояние UIRouter
со своим контроллером и шаблоном.
В настоящее время я предоставляю функциональность листовки через службу. Идея заключалась в том, чтобы эта служба инициализировала карту Leaflet и предоставила некоторый ограниченный доступ к контроллеру состояния. Таким образом, эти контроллеры будут вызывать сервисные функции, такие как setupMarkersInteractions
, для настройки обратных вызовов, которые, например, позволяют размещать маркеры на карте.
Однако у меня возникла проблема при инициализации карты через функцию leaflet.map()
Leaflet, а именно: Error: Map container not found
. Это связано с тем, что Leaflet не может найти элемент HTML, с которым должна быть связана карта.
В настоящее время я вроде делаю это:
function mapService() {
var map;
return {
initializeMap : initializeMap,
setupMarkersInteractions : setupMarkersInteractions
};
function initializeMap() {
map = leaflet.map('map');
}
function setupMarkersInteractions() {
map.on('click', markerPlacementCallback);
}
}
Функция initializeMap
сообщает leaflet.map
искать элемент HTML с id='map'
, который объявлен в шаблоне состояния.
Теперь, сам вопрос, связано ли это с какой-то неспособностью служб AngularJS получить доступ к HTML-шаблону? Я ничего не смог найти по этому вопросу, но я подумал, что для сервисов имеет смысл не обращаться к представлению напрямую...
Если да, то какой обходной путь мне следует изучить? Я изучил leaflet-directive
, но, похоже, он не дает возможности добавлять и удалять пользовательские обратные вызовы с той гибкостью, которую я хотел бы (например, когда я добавляю функцию свободного рисования с помощью Leaflet-Freedraw, все усложняется).
Я рассматривал возможность использования leaflet.map
напрямую с аргументом HTMLElement
для элемента, но все же не смог заставить его работать, хотя есть вероятность, что я не передаю то, что должно.