@@ -50,6 +50,15 @@ Ext.define('GeoExt.tree.LayerNode', {
50
50
'GeoExt.Version' ,
51
51
'GeoExt.tree.Util'
52
52
] ,
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
+
53
62
/**
54
63
* The init method is invoked after initComponent method has been run for
55
64
* the client Component. It performs plugin initialization.
@@ -81,8 +90,25 @@ Ext.define('GeoExt.tree.LayerNode', {
81
90
scope : this
82
91
} ) ;
83
92
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
+ } ) ;
86
112
}
87
113
88
114
GeoExt . tree . Util . enforceOneLayerVisible ( this . target ) ;
@@ -114,6 +140,38 @@ Ext.define('GeoExt.tree.LayerNode', {
114
140
}
115
141
} ,
116
142
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
+
117
175
/**
118
176
* handler for map moveend events to determine if node should be
119
177
* disabled or enabled
0 commit comments