Skip to content
This repository was archived by the owner on Nov 7, 2023. It is now read-only.

Commit 9442954

Browse files
committed
fix(markers oldModels undefined):
- markers fix with nested logic. oldModels isDefined checks feat(event registration leafletEvents.addEvents): added a utility to reuse code and keep leaflet.js and eventBroadcast.js DRY
1 parent 40abcb1 commit 9442954

10 files changed

+148
-142
lines changed

dist/angular-leaflet-directive.js

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
* angular-leaflet-directive 0.8.4 2015-06-23
2+
* angular-leaflet-directive 0.8.4 2015-06-26
33
* angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps
44
* git: https://github.com/tombatossals/angular-leaflet-directive
55
*/
@@ -43,8 +43,8 @@ angular.module("leaflet-directive", []).directive('leaflet',
4343
link: function(scope, element, attrs, ctrl) {
4444
var isDefined = leafletHelpers.isDefined,
4545
defaults = leafletMapDefaults.setDefaults(scope.defaults, attrs.id),
46-
genDispatchMapEvent = leafletEvents.genDispatchMapEvent,
47-
mapEvents = leafletEvents.getAvailableMapEvents();
46+
mapEvents = leafletEvents.getAvailableMapEvents(),
47+
addEvents = leafletEvents.addEvents;
4848

4949
scope.mapId = attrs.id;
5050
leafletData.setDirectiveControls({}, attrs.id);
@@ -132,12 +132,7 @@ angular.module("leaflet-directive", []).directive('leaflet',
132132
// if no event-broadcast attribute, all events are broadcasted
133133
if (!isDefined(attrs.eventBroadcast)) {
134134
var logic = "broadcast";
135-
for (var i = 0; i < mapEvents.length; i++) {
136-
var eventName = mapEvents[i];
137-
map.on(eventName, genDispatchMapEvent(scope, eventName, logic), {
138-
eventName: eventName
139-
});
140-
}
135+
addEvents(map, mapEvents, "eventName", scope, logic);
141136
}
142137

143138
// Resolve the map object to the promises
@@ -423,14 +418,25 @@ angular.module("leaflet-directive")
423418
}]);
424419

425420
angular.module("leaflet-directive").factory('leafletEvents',
426-
["leafletMapEvents", "leafletMarkerEvents", "leafletPathEvents", function (leafletMapEvents, leafletMarkerEvents, leafletPathEvents) {
427-
//NOTE THIS SHOULD BE DEPRECATED infavor of getting a specific events helper
428-
return angular.extend({},
421+
["leafletMapEvents", "leafletMarkerEvents", "leafletPathEvents", "leafletIterators", function (leafletMapEvents, leafletMarkerEvents, leafletPathEvents, leafletIterators) {
422+
//NOTE THIS SHOULD BE DEPRECATED infavor of getting a specific events helper
423+
var instance = angular.extend({},
429424
leafletMapEvents, {
430425
bindMarkerEvents: leafletMarkerEvents.bindEvents,
431426
getAvailableMarkerEvents: leafletMarkerEvents.getAvailableEvents
432-
},
433-
leafletPathEvents);
427+
}, leafletPathEvents);
428+
429+
var genDispatchMapEvent = instance.genDispatchMapEvent;
430+
431+
instance.addEvents = function(map, mapEvents, contextName, scope, logic){
432+
leafletIterators.each(mapEvents, function(eventName) {
433+
var context = {};
434+
context[contextName] = eventName;
435+
map.on(eventName, genDispatchMapEvent(scope, eventName, logic), context);
436+
});
437+
};
438+
439+
return instance;
434440
}]);
435441

436442
angular.module("leaflet-directive")
@@ -2805,7 +2811,8 @@ angular.module("leaflet-directive").directive('center',
28052811
safeApply = leafletHelpers.safeApply,
28062812
isValidCenter = leafletHelpers.isValidCenter,
28072813
isValidBounds = leafletBoundsHelpers.isValidBounds,
2808-
isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty;
2814+
isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty,
2815+
errorHeader = leafletHelpers.errorHeader;
28092816

28102817
var shouldInitializeMapWithBounds = function(bounds, center) {
28112818
return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center);
@@ -2831,7 +2838,7 @@ angular.module("leaflet-directive").directive('center',
28312838
var defaults = leafletMapDefaults.getDefaults(attrs.id);
28322839

28332840
if (attrs.center.search("-") !== -1) {
2834-
$log.error('The "center" variable can\'t use a "-" on his key name: "' + attrs.center + '".');
2841+
$log.error(errorHeader + ' The "center" variable can\'t use a "-" on his key name: "' + attrs.center + '".');
28352842
map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
28362843
return;
28372844
} else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) {
@@ -2865,7 +2872,7 @@ angular.module("leaflet-directive").directive('center',
28652872
};
28662873
});
28672874
} else if (!isDefined(centerModel)) {
2868-
$log.error('The "center" property is not defined in the main scope');
2875+
$log.error(errorHeader + ' The "center" property is not defined in the main scope');
28692876
map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
28702877
return;
28712878
} else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) {
@@ -2911,7 +2918,7 @@ angular.module("leaflet-directive").directive('center',
29112918
}
29122919

29132920
if (!isValidCenter(center) && center.autoDiscover !== true) {
2914-
$log.warn("[AngularJS - Leaflet] invalid 'center'");
2921+
$log.warn(errorHeader + " invalid 'center'");
29152922
//map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
29162923
return;
29172924
}
@@ -2949,7 +2956,7 @@ angular.module("leaflet-directive").directive('center',
29492956
mapReady = true;
29502957
});
29512958

2952-
map.on("moveend", function(/* event */) {
2959+
map.on('moveend', function(/* event */) {
29532960
// Resolve the center after the first map position
29542961
_leafletCenter.resolve();
29552962
leafletEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search());
@@ -2961,21 +2968,20 @@ angular.module("leaflet-directive").directive('center',
29612968
safeApply(leafletScope, function(scope) {
29622969
if (!leafletScope.settingCenterFromScope) {
29632970
//$log.debug("updating center model...", map.getCenter(), map.getZoom());
2964-
29652971
angular.extend(scope.center,{
2966-
lat: map.getCenter().lat,
2967-
lng: map.getCenter().lng,
2968-
zoom: map.getZoom(),
2969-
autoDiscover: false
2972+
lat: map.getCenter().lat,
2973+
lng: map.getCenter().lng,
2974+
zoom: map.getZoom(),
2975+
autoDiscover: false
29702976
});
29712977
}
29722978
leafletEvents.notifyCenterChangedToBounds(leafletScope, map);
29732979
});
29742980
});
29752981

29762982
if (centerModel.autoDiscover === true) {
2977-
map.on("locationerror", function() {
2978-
$log.warn("[AngularJS - Leaflet] The Geolocation API is unauthorized on this page.");
2983+
map.on('locationerror', function() {
2984+
$log.warn(errorHeader + " The Geolocation API is unauthorized on this page.");
29792985
if (isValidCenter(centerModel)) {
29802986
map.setView([centerModel.lat, centerModel.lng], centerModel.zoom);
29812987
leafletEvents.notifyCenterChangedToBounds(leafletScope, map);
@@ -3133,7 +3139,7 @@ angular.module("leaflet-directive").directive("decorations", ["$log", "leafletHe
31333139
};
31343140
}]);
31353141

3136-
angular.module("leaflet-directive").directive('eventBroadcast', ["$log", "$rootScope", "leafletHelpers", "leafletEvents", function ($log, $rootScope, leafletHelpers, leafletEvents) {
3142+
angular.module("leaflet-directive").directive('eventBroadcast', ["$log", "$rootScope", "leafletHelpers", "leafletEvents", "leafletIterators", function ($log, $rootScope, leafletHelpers, leafletEvents, leafletIterators) {
31373143
return {
31383144
restrict: "A",
31393145
scope: false,
@@ -3146,14 +3152,12 @@ angular.module("leaflet-directive").directive('eventBroadcast', ["$log", "$rootS
31463152
leafletScope = controller.getLeafletScope(),
31473153
eventBroadcast = leafletScope.eventBroadcast,
31483154
availableMapEvents = leafletEvents.getAvailableMapEvents(),
3149-
genDispatchMapEvent = leafletEvents.genDispatchMapEvent;
3155+
addEvents = leafletEvents.addEvents;
31503156

31513157
controller.getMap().then(function(map) {
31523158

3153-
var mapEvents = [];
3154-
var i;
3155-
var eventName;
3156-
var logic = "broadcast";
3159+
var mapEvents = [],
3160+
logic = "broadcast";
31573161

31583162
// We have a possible valid object
31593163
if (!isDefined(eventBroadcast.map)) {
@@ -3176,23 +3180,18 @@ angular.module("leaflet-directive").directive('eventBroadcast', ["$log", "$rootS
31763180
$log.warn("[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.");
31773181
} else {
31783182
// Enable events
3179-
for (i = 0; i < eventBroadcast.map.enable.length; i++) {
3180-
eventName = eventBroadcast.map.enable[i];
3183+
leafletIterators.each(eventBroadcast.map.enable, function(eventName) {
31813184
// Do we have already the event enabled?
31823185
if (mapEvents.indexOf(eventName) === -1 && availableMapEvents.indexOf(eventName) !== -1) {
31833186
mapEvents.push(eventName);
31843187
}
3185-
}
3188+
});
31863189
}
31873190

31883191
}
3189-
3190-
for (i = 0; i < mapEvents.length; i++) {
3191-
eventName = mapEvents[i];
3192-
map.on(eventName, genDispatchMapEvent(leafletScope, eventName, logic), {
3193-
eventName: eventName
3194-
});
3195-
}
3192+
// as long as the map is removed in the root leaflet directive we
3193+
// do not need ot clean up the events as leaflet does it itself
3194+
addEvents(map, mapEvents, "eventName", leafletScope, logic);
31963195
});
31973196
}
31983197
};
@@ -4032,7 +4031,8 @@ angular.module("leaflet-directive").directive('markers',
40324031
leafletMarkerEvents.bindEvents(marker, pathToMarker, model, leafletScope, layerName);
40334032
}
40344033
else {
4035-
updateMarker(model, oldModels[newName], maybeLMarker, pathToMarker, leafletScope, layers, map);
4034+
var oldModel = isDefined(oldModel)? oldModels[newName] : undefined;
4035+
updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map);
40364036
}
40374037
}
40384038
};
@@ -4122,7 +4122,8 @@ angular.module("leaflet-directive").directive('markers',
41224122
var _clean = function(models, oldModels){
41234123
if(isNested) {
41244124
$it.each(models, function(markerToMaybeDel, layerName) {
4125-
_destroy(markerToMaybeDel, oldModels[layerName], leafletMarkers[layerName], map, layers);
4125+
var oldModel = isDefined(oldModel)? oldModels[layerName] : undefined;
4126+
_destroy(markerToMaybeDel, oldModel, leafletMarkers[layerName], map, layers);
41264127
});
41274128
return;
41284129
}
@@ -4134,7 +4135,8 @@ angular.module("leaflet-directive").directive('markers',
41344135
var skips = null;
41354136
if(isNested) {
41364137
$it.each(models, function(markersToAdd, layerName) {
4137-
skips = _getNewModelsToSkipp(models[layerName], oldModels[layerName], leafletMarkers[layerName]);
4138+
var oldModel = isDefined(oldModel)? oldModels[layerName] : undefined;
4139+
skips = _getNewModelsToSkipp(models[layerName], oldModel, leafletMarkers[layerName]);
41384140
_addMarkers(markersToAdd, oldModels, map, layers, leafletMarkers, leafletScope,
41394141
watchOptions, layerName, skips);
41404142
});
@@ -4601,7 +4603,7 @@ angular.module("leaflet-directive")
46014603
return EventsHelper;
46024604
}])
46034605
.service('leafletEventsHelpers', ["leafletEventsHelpersFactory", function(leafletEventsHelpersFactory){
4604-
return new leafletEventsHelpersFactory();
4606+
return new leafletEventsHelpersFactory();
46054607
}]);
46064608

46074609
angular.module("leaflet-directive")

dist/angular-leaflet-directive.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)