7

I want to insert my custom html markup with $scope event handlers to message property of leaflet marker. For example:

App.controller('testController', ['$scope', "leafletEvents", '$compile', 'leafletMarkersHelpers',
function($scope, leafletEvents, $compile, leafletMarkersHelpers){

angular.extend($scope, {
    currentLocation : {
        lat: 20,
        lng: 20,
        zoom: 20
    },
    markers: {
    },
    defaults: {
        scrollWheelZoom: true
    },
    events: {
        map: {
            enable: ['zoomstart', 'drag', 'click', 'mousemove', 'popupopen'],
            logic: 'emit'
        },
        markers: {
            enable: leafletEvents.getAvailableMarkerEvents()
        }
    }
});
var html = " <a href=''>info</a><button type='button' ng-click='doSomeAction()'>Choose</button>";
var item = {...}; //some data for marker
            $scope.markers["newMarker"] = {
                lat: item.lat,
                lng: item.lng,
                message: item.message + html,
                draggable: false
            }

So doSomeAction() method doesn't triggers because controller doesn't bind it to view. I tried to do next stuff:

 //this code belongs to the same controller
 //data.leafletEvent.popup._content  html set for popup message before.
 $scope.$on('leafletDirectiveMap.popupopen', function(event, data){
    var html = "<p>" + data.leafletEvent.popup._content + "</p>";
    var template = angular.element(html);
    $compile(html)($scope);
    $scope.$digest();
});
$scope.doSomeAction = function() {
//never fires
   console.log(arguments);
}

But it doesn't work. So if anyone has ideas please feel free to share.

David
  • 9,635
  • 5
  • 62
  • 68
Eugene
  • 103
  • 1
  • 7
  • It is unclear if your code excerpts belong to a directive and/or a controller. Please be more specific. – Christian Bonato May 31 '14 at 13:44
  • @Bonatoc , corrected. And I want to mention that everything works ok except button in marker popup that doesn't responce on click... – Eugene May 31 '14 at 13:56
  • I'm not an Angular specialist, but I think what you need in the present case is a directive. https://www.google.fr/search?client=safari&rls=en&q=angularjs+directives+tutorial&ie=UTF-8&oe=UTF-8&gfe_rd=cr&ei=4u2JU7rSBayZ1AXs4IGoCA#q=angularjs+directives+tutorial&rls=en – Christian Bonato May 31 '14 at 14:59
  • 1
    I have added next code to leafletDirectiveMap.popupopen callback and now it works as expected `var $container = $(data.leafletEvent.popup._container).find('.leaflet-popup-content'); $container.empty(); var html = "

    " + data.leafletEvent.popup._content + "

    ", linkFunction = $compile(angular.element(html)), linkedDOM = linkFunction($scope); $container.append(linkedDOM);`
    – Eugene May 31 '14 at 18:02
  • You could try $scope.$apply(function () { $compile(html)($scope);}); instead of $scope.$digest(); – Bwyss Nov 17 '15 at 08:45

1 Answers1

5

You can now easily use Angular templates in a popup message:

var html = " <a href=''>info</a><button type='button' 
   ng-click='doSomeAction()'>Choose</button>";

$scope.markers.push({ lat: ..., 
                      lng: ...,
                      message: html,
                      getMessageScope: function() {return $scope; }
                    });
David
  • 9,635
  • 5
  • 62
  • 68
  • 1
    This works really well! I wonder why there's no example on the site... However, `compileMessage` might also have to be set to `true` in the object you pass to the `push` method in the latest version of the plugin. Also, this only works for markers and not paths etc. – sibbl May 05 '15 at 12:51