[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