Skip to content

Commit a9efeb1

Browse files
committed
Merge pull request #357 from bentrm/layernode
Dispose layer tree node event listeners.
2 parents da5e491 + 5cf29d3 commit a9efeb1

File tree

1 file changed

+60
-2
lines changed

1 file changed

+60
-2
lines changed

src/GeoExt/tree/LayerNode.js

+60-2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@ Ext.define('GeoExt.tree.LayerNode', {
5050
'GeoExt.Version',
5151
'GeoExt.tree.Util'
5252
],
53+
54+
/**
55+
* Cached map this layer node's layer is associated with.
56+
* @type {OpenLayers.Map}
57+
*
58+
* @private
59+
*/
60+
map: null,
61+
5362
/**
5463
* The init method is invoked after initComponent method has been run for
5564
* the client Component. It performs plugin initialization.
@@ -81,8 +90,25 @@ Ext.define('GeoExt.tree.LayerNode', {
8190
scope: this
8291
});
8392

84-
if (!layer.alwaysInRange && layer.map) {
85-
layer.map.events.register('moveend', this, this.onMapMoveend);
93+
if (layer.map) {
94+
this.map = layer.map;
95+
96+
// Triggers disposal of event listeners if the removed layer maps
97+
// to this plugins layer node.
98+
// TODO: Find a better way to link into lifecycle of the layer node
99+
// to dispose event listeners. See:
100+
// https://github.com/geoext/geoext2/pull/357
101+
this.map.events.on({
102+
'removelayer': this.onMapRemovelayer,
103+
scope: this
104+
});
105+
}
106+
107+
if (!layer.alwaysInRange && this.map) {
108+
this.map.events.on({
109+
'moveend': this.onMapMoveend,
110+
scope: this
111+
});
86112
}
87113

88114
GeoExt.tree.Util.enforceOneLayerVisible(this.target);
@@ -114,6 +140,38 @@ Ext.define('GeoExt.tree.LayerNode', {
114140
}
115141
},
116142

143+
/**
144+
* Disposes event handlers that have been added during initialization of plugin.
145+
* TODO: Add tests to make sure this works as expected.
146+
*
147+
* @private
148+
*/
149+
onMapRemovelayer: function(evt) {
150+
var target = this.target,
151+
layer = target.get('layer');
152+
153+
if (evt.layer !== layer) {
154+
return;
155+
}
156+
157+
target.un('afteredit', this.onAfterEdit, this);
158+
159+
layer.events.un({
160+
'visibilitychanged': this.onLayerVisibilityChanged,
161+
scope: this
162+
});
163+
164+
this.map.events.un({
165+
'removelayer': this.onMapRemovelayer,
166+
'moveend': this.onMapMoveend,
167+
scope: this
168+
});
169+
170+
this.map = null;
171+
172+
return true;
173+
},
174+
117175
/**
118176
* handler for map moveend events to determine if node should be
119177
* disabled or enabled

0 commit comments

Comments
 (0)