@@ -46,6 +46,7 @@ angular.module("leaflet-directive", []).directive('leaflet',
4646 genDispatchMapEvent = leafletEvents . genDispatchMapEvent ,
4747 mapEvents = leafletEvents . getAvailableMapEvents ( ) ;
4848
49+ scope . mapId = attrs . id ;
4950 leafletData . setDirectiveControls ( { } , attrs . id ) ;
5051
5152 // Set width and height utility functions
@@ -2422,7 +2423,7 @@ angular.module("leaflet-directive").service('leafletMarkersHelpers', ["$rootScop
24222423 addMarkerWatcher : function ( marker , name , leafletScope , layers , map , isDeepWatch ) {
24232424 var markerWatchPath = Helpers . getObjectArrayPath ( "markers." + name ) ;
24242425 isDeepWatch = defaultTo ( isDeepWatch , true ) ;
2425- //TODO:break up this 200 line function to be readable (nmccready)
2426+
24262427 var clearWatch = leafletScope . $watch ( markerWatchPath , function ( markerData , oldMarkerData ) {
24272428 if ( ! isDefined ( markerData ) ) {
24282429 _deleteMarker ( marker , map , layers ) ;
@@ -3910,6 +3911,27 @@ angular.module("leaflet-directive").directive('markers',
39103911 maybeWatch = leafletWatchHelpers . maybeWatch ,
39113912 extendDirectiveControls = leafletDirectiveControlsHelpers . extend ;
39123913
3914+ var _getLMarker = function ( leafletMarkers , name , maybeLayerName ) {
3915+ if ( ! Object . keys ( leafletMarkers ) . length ) return ;
3916+ if ( maybeLayerName && isString ( maybeLayerName ) ) {
3917+ if ( ! leafletMarkers [ maybeLayerName ] || ! Object . keys ( leafletMarkers [ maybeLayerName ] ) . length )
3918+ return ;
3919+ return leafletMarkers [ maybeLayerName ] [ name ] ;
3920+ }
3921+ return leafletMarkers [ name ] ;
3922+ } ;
3923+
3924+ var _setLMarker = function ( lObject , leafletMarkers , name , maybeLayerName ) {
3925+ if ( maybeLayerName && isString ( maybeLayerName ) ) {
3926+ if ( ! isDefined ( leafletMarkers [ maybeLayerName ] ) )
3927+ leafletMarkers [ maybeLayerName ] = { } ;
3928+ leafletMarkers [ maybeLayerName ] [ name ] = lObject ;
3929+ }
3930+ else
3931+ leafletMarkers [ name ] = lObject ;
3932+ return lObject ;
3933+ } ;
3934+
39133935 var _maybeAddMarkerToLayer = function ( layerName , layers , model , marker , doIndividualWatch , map ) {
39143936
39153937 if ( ! isString ( layerName ) ) {
@@ -3956,7 +3978,8 @@ angular.module("leaflet-directive").directive('markers',
39563978
39573979 var model = Helpers . copy ( markersToRender [ newName ] ) ;
39583980 var pathToMarker = Helpers . getObjectDotPath ( maybeLayerName ? [ maybeLayerName , newName ] : [ newName ] ) ;
3959- if ( ! isDefined ( leafletMarkers [ newName ] ) ) {
3981+ var maybeLMarker = _getLMarker ( leafletMarkers , newName , maybeLayerName ) ;
3982+ if ( ! isDefined ( maybeLMarker ) ) {
39603983 //(nmccready) very important to not have model changes when lObject is changed
39613984 //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal
39623985 //if it is left as the reference then all changes from oldModel vs newModel are ignored
@@ -3967,7 +3990,7 @@ angular.module("leaflet-directive").directive('markers',
39673990 $log . error ( errorHeader + ' Received invalid data on the marker ' + newName + '.' ) ;
39683991 continue ;
39693992 }
3970- leafletMarkers [ newName ] = marker ;
3993+ _setLMarker ( marker , leafletMarkers , newName , maybeLayerName ) ;
39713994
39723995 // Bind message
39733996 if ( isDefined ( model . message ) ) {
@@ -4009,7 +4032,7 @@ angular.module("leaflet-directive").directive('markers',
40094032 leafletMarkerEvents . bindEvents ( marker , pathToMarker , model , leafletScope , layerName ) ;
40104033 }
40114034 else {
4012- updateMarker ( model , oldModels [ newName ] , leafletMarkers [ newName ] , pathToMarker , leafletScope , layers , map ) ;
4035+ updateMarker ( model , oldModels [ newName ] , maybeLMarker , pathToMarker , leafletScope , layers , map ) ;
40134036 }
40144037 }
40154038 } ;
@@ -4097,19 +4120,27 @@ angular.module("leaflet-directive").directive('markers',
40974120
40984121 getLayers ( ) . then ( function ( layers ) {
40994122 var _clean = function ( models , oldModels ) {
4123+ if ( isNested ) {
4124+ $it . each ( models , function ( markerToMaybeDel , layerName ) {
4125+ _destroy ( markerToMaybeDel , oldModels [ layerName ] , leafletMarkers [ layerName ] , map , layers ) ;
4126+ } ) ;
4127+ return ;
4128+ }
41004129 _destroy ( models , oldModels , leafletMarkers , map , layers ) ;
41014130 } ;
41024131
41034132 var _create = function ( models , oldModels ) {
41044133 _clean ( models , oldModels ) ;
4105- var skips = _getNewModelsToSkipp ( models , oldModels , leafletMarkers ) ;
4134+ var skips = null ;
41064135 if ( isNested ) {
41074136 $it . each ( models , function ( markersToAdd , layerName ) {
4137+ skips = _getNewModelsToSkipp ( models [ layerName ] , oldModels [ layerName ] , leafletMarkers [ layerName ] ) ;
41084138 _addMarkers ( markersToAdd , oldModels , map , layers , leafletMarkers , leafletScope ,
41094139 watchOptions , layerName , skips ) ;
41104140 } ) ;
41114141 return ;
41124142 }
4143+ skips = _getNewModelsToSkipp ( models , oldModels , leafletMarkers ) ;
41134144 _addMarkers ( models , oldModels , map , layers , leafletMarkers , leafletScope ,
41144145 watchOptions , undefined , skips ) ;
41154146 } ;
@@ -4722,12 +4753,15 @@ angular.module("leaflet-directive")
47224753 ] ;
47234754 } ;
47244755
4725- var _genDispatchMapEvent = function ( scope , eventName , logic ) {
4756+ var _genDispatchMapEvent = function ( scope , eventName , logic , mapId ) {
4757+ // (nmccready) We should consider passing mapId as an argument or using it from scope
47264758 return function ( e ) {
47274759 // Put together broadcast name
4760+ // (nmccready) We should consider passing mapId joining mapId to the broadcastName to keep the event unique. Same should be done for all directives so we know what map it comes from.
4761+ // problem with this is it will cause a minor bump and break backwards compat
47284762 var broadcastName = 'leafletDirectiveMap.' + eventName ;
47294763 // Safely broadcast the event
4730- fire ( scope , broadcastName , logic , e , e . target , scope )
4764+ fire ( scope , broadcastName , logic , e , e . target , scope , mapId )
47314765 } ;
47324766 } ;
47334767
0 commit comments