[Commits] r2819 - in sandbox/gxm/geoext/gxm: lib/GXM/widgets tests/lib/widgets

commits at geoext.org commits at geoext.org
Wed Aug 17 16:47:51 CEST 2011


Author: marcjansen
Date: 2011-08-17 16:47:51 +0200 (Wed, 17 Aug 2011)
New Revision: 2819

Modified:
   sandbox/gxm/geoext/gxm/lib/GXM/widgets/LayerList.js
   sandbox/gxm/geoext/gxm/tests/lib/widgets/LayerList.test.html
Log:
[gxm] implement a methiod beforeDestroy to cleanup eventlisteners on destroy of the list

Modified: sandbox/gxm/geoext/gxm/lib/GXM/widgets/LayerList.js
===================================================================
--- sandbox/gxm/geoext/gxm/lib/GXM/widgets/LayerList.js	2011-08-17 14:46:03 UTC (rev 2818)
+++ sandbox/gxm/geoext/gxm/lib/GXM/widgets/LayerList.js	2011-08-17 14:47:51 UTC (rev 2819)
@@ -97,7 +97,7 @@
     
     /** api: property[invisibleOverlayCls]
      * 
-     *  ``String`` The CSS class that the list items forcurrently invisible 
+     *  ``String`` The CSS class that the list items for currently invisible 
      *  overlay layers will get. 
      *  
      *  Defaults to ``gxm-invisible-overlay-indicator``.
@@ -134,15 +134,11 @@
             this.store = this.mapPanel.layers;
         } else {
             this.store = this.layers || this.store;
-            
-            
-            
         }
+        
         // we need a reference inside of the XTemplate-member functions for the 
         // different list-item classes.
         var me = this;
-        //TODO: or only one if that returns correct CSS-class?
-        //TODO: figure out how to use rec.getLayer() inside of templates, that'd make rec.layer obsolete
         this.itemTpl = new Ext.XTemplate(
             '<span class="{[this.getVisibilityIconClass(values.layer)]}"></span>',
             '<span class="gxm-layer-item">{name}</span>',
@@ -199,7 +195,7 @@
      *  :return: ``Object`` the adjusted data with a new member ``layer`` 
      *      referencing the raw ``OpenLayers.Layer``-object
      *      
-     *  A private methode to give this DataViews template-methods access to the 
+     *  A private method to give this DataViews template-methods access to the 
      *  raw ``OpenLayers.Layer``-object.
      */
     prepareData: function(data, index, record) {
@@ -240,8 +236,29 @@
         //TODO: check whether this.store.load is enough (no argument passed).
         this.store.load(this.mapPanel.layers);
         this.refresh();
+    },
+    
+    /** private: method[beforeDestroy]
+     *  
+     *  Called prior to destroying the list. We remove all our registered 
+     *  handlers and nullify relevant properties.
+     */
+    beforeDestroy: function(){
+        if (this.map && this.map.events) {
+            this.map.events.un({
+                "changelayer": this.onChangeLayer,
+                "addlayer": this.onChangeLayer,
+                "removelayer": this.onChangeLayer,
+                scope: this
+            });            
+        }
+        delete this.map;
+        delete this.mapPanel;
+        delete this.store;
+        delete this.layers;
+        
+        GXM.LayerList.superclass.beforeDestroy.call(this);
     }
-    
 });
 
 /** api: xtype = gxm_layerlist */

Modified: sandbox/gxm/geoext/gxm/tests/lib/widgets/LayerList.test.html
===================================================================
--- sandbox/gxm/geoext/gxm/tests/lib/widgets/LayerList.test.html	2011-08-17 14:46:03 UTC (rev 2818)
+++ sandbox/gxm/geoext/gxm/tests/lib/widgets/LayerList.test.html	2011-08-17 14:47:51 UTC (rev 2819)
@@ -241,6 +241,90 @@
     });
 }
 
+function test_destroy(t) {
+    var funcToStringSupported = !!(Function.prototype.toString);
+    
+    if (funcToStringSupported) {
+        t.plan(9);
+    } else {
+        t.plan(6);
+    }
+    
+    t.delay_call(1, function(){
+        var map = new OpenLayers.Map({
+            layers: [
+                new OpenLayers.Layer(null, {
+                    isBaseLayer: true
+                })
+            ],
+            controls: []
+        });
+        
+        var mappanel = new GXM.MapPanel({
+            map: map
+        });
+        
+        // remove existing default handlers to make comparison easy:
+        map.events.listeners.changelayer = [];
+        map.events.listeners.addlayer = [];
+        map.events.listeners.removelayer = [];
+        
+        var onChangeLayerFunc = function(){ return 'onChangeLayer'; };
+        
+        var layerlist = {
+            xtype: 'gxm_layerlist',
+            mapPanel: mappanel,
+            onChangeLayer: onChangeLayerFunc
+        };
+    
+        var myTabPanel = new Ext.TabPanel({
+            items: [mappanel, layerlist],
+            fullscreen: true
+        });
+        
+        t.delay_call(1, function(){
+            
+            // 
+            var map = mappanel.map;
+            
+            // 3 tests
+            // have the events been registered?    
+            t.eq(map.events.listeners.changelayer.length, 1,
+                'A changelayer eventlistener was added to the map');
+            t.eq(map.events.listeners.addlayer.length, 1,
+                'A addlayer eventlistener was added to the map');
+            t.eq(map.events.listeners.removelayer.length, 1,
+                'A removelayer eventlistener was added to the map');
+            
+            if (funcToStringSupported) {
+                // 3 tests
+                // have the correct event listeners been registered?    
+                t.eq(map.events.listeners.changelayer[0].func.toString(), 
+                    onChangeLayerFunc.toString(), 
+                    'The correct changelayer eventlistener was added to the map');
+                t.eq(map.events.listeners.addlayer[0].func.toString(), 
+                    onChangeLayerFunc.toString(), 
+                    'The correct changelayer eventlistener was added to the map');
+                t.eq(map.events.listeners.removelayer[0].func.toString(), 
+                    onChangeLayerFunc.toString(), 
+                    'The correct changelayer eventlistener was added to the map');
+            }
+            
+            myTabPanel.items.get(1).destroy();
+            
+            // 3 tests
+            t.eq(map.events.listeners.changelayer.length, 0,
+                'The changelayer eventlistener was removed from the map');
+            t.eq(map.events.listeners.addlayer.length, 0,
+                'The addlayer eventlistener was removed from the map');
+            t.eq(map.events.listeners.removelayer.length, 0,
+                'The removelayer eventlistener was removed from the map');
+            
+            mappanel.destroy()
+            myTabPanel.destroy();
+        });
+    });
+}
 
         
         </script>



More information about the Commits mailing list