Событие управления Angular Leaflet Search

У меня есть приложение AngularJS, и в настоящее время я пытаюсь получить доступ к событию «search_expanded» Leaflet Search управление, но безуспешно.

Вот мой код:

angular.module('myApp', [ 'leaflet-directive' ])
       .controller('ShowMapCtrl', ["$scope", "leafletData", function ($scope, leafletData) {
       // some code
            leafletData.getMap().then(function(map) {
                       map.on('search_expanded', function(e){
                            alert("search control expannded"); 
                       });
                   });

person noxfur    schedule 13.02.2016    source источник
comment
попробуй сделать.. $scope.$on('search_expanded', console.log);   -  person Minato    schedule 13.02.2016
comment
это был мой первый подход, но он не сработал   -  person noxfur    schedule 13.02.2016
comment
$rootScope.$on('search_expanded', console.log); 2-й подход?   -  person Minato    schedule 13.02.2016
comment
angular.element(document).on('search_expanded',console.log); 3-й подход?   -  person Minato    schedule 13.02.2016
comment
это странно .. у вас установлен jQuery?   -  person Minato    schedule 13.02.2016
comment
да. уже пробовал $(document).on("search_expanded", function(e){console.log("test")});   -  person noxfur    schedule 13.02.2016


Ответы (3)


Событие search_expanded и все другие события, поддерживаемые L.Control.Search, запускаются в фактическом экземпляре элемента управления, а не в экземпляре карты, как вы можете видеть в следующем примере:

var controlSearch = new L.Control.Search({
    layer: new L.LayerGroup()
}).on('search_expanded', function () {
    console.log('search_expanded!')
}).addTo(map);

http://plnkr.co/edit/njeXYb4PfbaG3hppcgmO?p=preview

person iH8    schedule 13.02.2016
comment
да, но angular-leaflet-directive имеет другой способ внедрение элемента управления поиском, который отключает традиционный способ перехвата событий - person noxfur; 13.02.2016
comment
Я знаю и сожалею, что, на самом деле, невозможно получить экземпляр элемента управления поиском из leafletControlHelpers, поскольку элементы управления не хранятся в общедоступном свойстве. Таким образом, единственное решение, которое у вас осталось, — это захватить экземпляр карты в вашем контроллере и вручную добавить к нему элемент управления. Я знаю, что это отстой. Использование этой директивы имеет серьезные недостатки, такие как раздувание и упускание половины функций, которые вы могли бы получить при запуске простого Leaflet с вашей собственной директивой и размещении всей логики в вашем контроллере или службе. Удачи. - person iH8; 13.02.2016
comment
Я также искал среди помощников. Неудивительно, что я не могу найти ничего, что я мог бы использовать, чтобы получить событие. Я нашел обходной путь, хотя. Это немного небрежно, но вроде работает. - person noxfur; 14.02.2016
comment
@schizoskmrkxx не поделитесь? - person Stephan; 30.05.2016
comment
@Stephan, я только что восстановил свой небрежный обходной путь. Пожалуйста, проверьте мой ответ. Но в конце концов я выбрал ответ iH8. - person noxfur; 31.05.2016

Во-первых, я бы попытался добавить туда обработку исключений:

leafletData.getMap().then(function(map) {
    map.on('search_expanded', function(e){
        alert("search control expannded"); 
    }, function(reason) {
        alert('Failed: ' + reason);
});

Кроме того, вместо предупреждения я предпочитаю использовать console.log(), особенно с приложениями Angular.

leafletData.getMap().then(function(map) {
    map.on('search_expanded', function(e){
        console.log("search control expannded"); 
    }, function(reason) {
        console.log('Failed: ' + reason);
});
person Jeremy Morgan    schedule 13.02.2016
comment
Спасибо, но проблема не в обещании. Он успешно возвращает обещание каждый раз. Проблема в том, что я не знаю, как перехватить событие search_expanded при срабатывании. - person noxfur; 13.02.2016

Я придумал неаккуратный обходной путь, поскольку директива не позволяет мне перехватывать события управления поиском.

var expanded = false;

$scope.$on('leafletDirectiveMap.layeradd', function(){

    $('input.search-input').focus(function(){

        expanded = !expanded;

        if(expanded)
        {
            console.log("search control expanded");
        }

    });
});
person noxfur    schedule 14.02.2016