Skip to content

Commit f0d44de

Browse files
committed
Fixes #4. Map options reset when angulargmMapController is re-instantiated.
1 parent c297c83 commit f0d44de

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

src/controllers/angulargmMapController.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
// 'private' properties
4747
this._map = this._createMap(mapId, mapDiv, config, gMContainer, $scope);
4848
this._markers = {};
49+
this._listeners = [];
4950

5051
// 'public' properties
5152
this.dragging = false;
@@ -129,6 +130,7 @@
129130
} else {
130131
var div = map.getDiv();
131132
element.replaceWith(div);
133+
map.setOptions(config);
132134
}
133135
return map;
134136
};
@@ -152,7 +154,9 @@
152154

153155

154156
this._destroy = function() {
155-
google.maps.event.clearInstanceListeners(this._map);
157+
angular.forEach(this._listeners, function(listener) {
158+
google.maps.event.removeListener(listener);
159+
});
156160

157161
var scopeIds = Object.keys(this._markers);
158162
var self = this;
@@ -171,8 +175,8 @@
171175
* @ignore
172176
*/
173177
this.addMapListener = function(event, handler) {
174-
google.maps.event.addListener(this._map,
175-
event, handler);
178+
var listener = google.maps.event.addListener(this._map, event, handler);
179+
this._listeners.push(listener);
176180
};
177181

178182

test/unit/controllers/angulargmMapController.js

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
describe('angulargmMapController', function() {
2-
var scope;
2+
var scope, elm;
33
var mapCtrl, mapCntr;
44

55
beforeEach(function() {
@@ -22,7 +22,7 @@ describe('angulargmMapController', function() {
2222
};
2323

2424
// set up element
25-
var elm = angular.element('<div gm-map-id="mapId" gm-center="center" gm-zoom="zoom" gm-bounds="bounds" gm-map-options="mapOptions">' +
25+
elm = angular.element('<div gm-map-id="mapId" gm-center="center" gm-zoom="zoom" gm-bounds="bounds" gm-map-options="mapOptions">' +
2626
'<div id="test"></div>' +
2727
'</div');
2828

@@ -31,11 +31,19 @@ describe('angulargmMapController', function() {
3131
}));
3232

3333

34+
afterEach(inject(function(angulargmContainer) {
35+
if (scope && scope.$destroy) {
36+
scope.$destroy();
37+
}
38+
angulargmContainer.removeMap('test');
39+
}));
40+
41+
3442
it('constructs the map using the provided map options', function() {
3543
expect(mapCtrl.dragging).toBeFalsy();
3644
expect(mapCtrl.center).toEqual(new google.maps.LatLng(2, 3));
3745
expect(mapCtrl.zoom).toEqual(1);
38-
var map = mapCntr.getMap('test');
46+
var map = mapCntr.getMap(scope.gmMapId());
3947
expect(mapCtrl.bounds).toEqual(map.getBounds());
4048
});
4149

@@ -47,16 +55,44 @@ describe('angulargmMapController', function() {
4755
return 'test2';
4856
};
4957

50-
var elm = angular.element('<div gm-map-id="mapId" gm-center="center" gm-zoom="zoom" gm-bounds="bounds">' +
58+
var elm2 = angular.element('<div gm-map-id="mapId" gm-center="center" gm-zoom="zoom" gm-bounds="bounds">' +
5159
'<div id="test2"></div>' +
5260
'</div');
53-
mapCtrl = $controller('angulargmMapController', {$scope: scope, $element: elm});
61+
mapCtrl = $controller('angulargmMapController', {$scope: scope, $element: elm2});
5462

5563
expect(mapCtrl.center).toEqual(angulargmDefaults.mapOptions.center);
5664
expect(mapCtrl.zoom).toEqual(angulargmDefaults.mapOptions.zoom);
5765
}));
5866

5967

68+
it('resets map on controller re-instantiation', inject(function($rootScope, $controller) {
69+
var map = mapCntr.getMap(scope.gmMapId());
70+
var scope2 = $rootScope.$new();
71+
var gmMapOptions = scope.gmMapOptions();
72+
var gmMapId = scope.gmMapId();
73+
scope2.gmMapOptions = function() { return gmMapOptions };
74+
scope2.gmMapId = function() { return gmMapId };
75+
76+
// move map
77+
var newCenter = new google.maps.LatLng(gmMapOptions.center.lat() + 5,
78+
gmMapOptions.center.lng() + 5);
79+
map.setCenter(newCenter);
80+
map.setZoom(gmMapOptions.zoom + 2);
81+
map.setMapTypeId(google.maps.MapTypeId.SATELLITE);
82+
expect(mapCtrl.center).toEqual(newCenter); // sanity check--we actually changed something
83+
84+
// destroy scope
85+
scope.$destroy();
86+
87+
// re-instantiate controller
88+
mapCtrl = $controller('angulargmMapController', {$scope: scope2, $element: elm});
89+
90+
expect(mapCtrl.center).toEqual(gmMapOptions.center);
91+
expect(mapCtrl.zoom).toEqual(gmMapOptions.zoom);
92+
expect(map.getMapTypeId()).toEqual(gmMapOptions.mapTypeId);
93+
}));
94+
95+
6096
it('removes markers on scope destroy', function() {
6197
var mapId = scope.gmMapId();
6298
scope.$destroy();
@@ -73,7 +109,7 @@ describe('angulargmMapController', function() {
73109
mapCtrl.addMapListener('center_changed', function() {
74110
called = true;
75111
});
76-
google.maps.event.trigger(mapCntr.getMap('test'), 'center_changed');
112+
google.maps.event.trigger(mapCntr.getMap(scope.gmMapId()), 'center_changed');
77113

78114
expect(called).toBeTruthy();
79115
});
@@ -84,8 +120,8 @@ describe('angulargmMapController', function() {
84120
mapCtrl.addMapListenerOnce('center_changed', function() {
85121
callCount++;
86122
});
87-
google.maps.event.trigger(mapCntr.getMap('test'), 'center_changed');
88-
google.maps.event.trigger(mapCntr.getMap('test'), 'center_changed');
123+
google.maps.event.trigger(mapCntr.getMap(scope.gmMapId()), 'center_changed');
124+
google.maps.event.trigger(mapCntr.getMap(scope.gmMapId()), 'center_changed');
89125

90126
expect(callCount).toEqual(1);
91127
});

0 commit comments

Comments
 (0)