Hi all,

this may be related to
http://trac.geoext.org/ticket/451

It happens in GeoExt 1.1, when I remove a WFS/Vector layer from OpenLayers
2.11

As far as I can see is VectorLegend.beforeDestroy not able to unregister
the zoomend event because this.layer.map is null.

The call stack is something like this:
GeoExt.VectorLegend.Ext.extend.beforeDestroy
<event handling>
OpenLayers.Map.removeLayer

Walkthrough:
1. In OpenLayers.Map.removeLayer is layer.map set to null
2. Then removeLayer event is triggered
3. beforeDestroy checks this.layer.map, which was set to null in
OL.Map.removeLayer, hence not able to unregister the zoomend event.
Then this.layer and this.map is set to null.

4. later VectorLegend.onStoreRemove tries to unregister the zoomend event,
but fails since this.layer=null (by beforeDestroy).

5. later VectorLegend.onMapZoom is called, where this.layer.map is
accessed, which is undefined. Then the client fails.


The workaround is to add exception handling around remove layer code.


OpenLayers.Map.removeLayer
removeLayer: function(layer, setNewBaseLayer) {
 if (this.events.triggerEvent("preremovelayer", {layer: layer}) === false) {
 return;
 }
if (setNewBaseLayer == null) {
 setNewBaseLayer = true;
 }

if (layer.isFixed) {
 this.viewPortDiv.removeChild(layer.div);
 } else {
 this.layerContainerDiv.removeChild(layer.div);
 }
OpenLayers.Util.removeItem(this.layers, layer);
 layer.removeMap(this);
 layer.map = null;

// if we removed the base layer, need to set a new one
if(this.baseLayer == layer) {
 this.baseLayer = null;
 if(setNewBaseLayer) {
 for(var i=0, len=this.layers.length; i<len; i++) {
 var iLayer = this.layers[i];
 if (iLayer.isBaseLayer || this.allOverlays) {
 this.setBaseLayer(iLayer);
 break;
 }
 }
}
}

this.resetLayersZIndex();

this.events.triggerEvent("removelayer", {layer: layer});
 layer.events.triggerEvent("removed", {map: this, layer: layer});
}

kind regards
Jørn Vegard
_______________________________________________
Dev mailing list
[email protected]
http://www.geoext.org/cgi-bin/mailman/listinfo/dev

Reply via email to