Имея два элемента div: представление карты и боковую панель, где каждая строка соответствует имени объекта, как я могу гарантировать, что событие щелчка в строке боковой панели выберет соответствующий объект на карте?
Это выполнимо с всплывающими окнами, но я хочу выбрать функцию, а не создавать маркер или всплывающее окно. Используя Angular и angular-leaflet-directive, у меня есть такое представление:
<div class="preview-wrapper container-fluid">
<div class="row">
<div class="col-md-8">
<leaflet id="map-preview" geojson="geojson" center="nyc"></leaflet>
</div>
<div class="col-md-4">
<div class="toolbox panel panel-default">
<div class="panel-heading">
<div class="panel-title text-center">Toolbox</div>
</div>
<div class="panel-body">
<div class="row" ng-repeat="segment in trails" ng-click="toolboxTrailSelect(segment)">{{ segment.properties.name }}</div>
</div>
</div>
</div>
</div>
</div>
Как видите, ng-repeat просто выводит имя функции, определенное в контроллере:
angular.module('dataUpload')
.controller('MapPreviewCtrl', function($scope, $log, $window, leafletData, fileReader) {
"use strict";
$scope.toolboxTrailSelect = function(obj) {
$log.debug(obj);
var latLng = new L.LatLng(obj.geometry.coordinates[0][0], obj.geometry.coordinates[0][1]);
leafletData.getMap('map-preview').then(function(map) {
map.fireEvent('click', {
latlng : latLng,
containerPoint : map.latLngToContainerPoint(latLng),
layerPoint : map.latLngToLayerPoint(latLng)
});
});
};
leafletData.getMap('map-preview').then(function(map) {
mapContainer = map;
var kml = fileReader.getLocalFile();
if (kml === null)
$log.error("No file loaded");
else {
var data = getData();
try {
map.fitBounds(data.latlng);
angular.extend($scope, {
geojson : {
data : data.geojson,
style : {
stroke : true,
weight : 5,
color : '#000000'
},
onEachFeature : function(feature, layer) {
layer.on('click', function(e) {
$log.debug('Path click event: ' + e);
}
);
}
}
});
} catch (e) {
$log.error(e.message);
$window.alert(e.message);
}
}
});
});
Когда создается экземпляр контроллера, он добавляет геометрию и свойства всех функций в область действия, которая затем повторяется в директиве ng-repeat.
Прямо сейчас для каждой функции определен обработчик кликов, который выводит отладочное сообщение. Каждая строка на боковой панели имеет событие клика, которое обрабатывается toolboxTrailSelect
.
Это делается для того, чтобы событие щелчка на боковой панели получало первую пару координат широта/долгота и запускало событие щелчка на основе этой пары координат. Это событие должно обрабатываться событием щелчка объекта карты.
Я получаю отладочное сообщение из события щелчка функции и из события щелчка боковой панели. Но я не получаю сообщение об отладке обработчика щелчка функции, когда происходит щелчок на боковой панели.