2012-06-11 60 views
2

當我打破的回調函數的第一行,這樣做激活/失敗

this.active --> true 
this.deactivate() --> true 
this.activate() --> true 
this.deactivate() --> false 

如何能這樣呢?

讓我來解釋發生這種情況的原因。

該地圖有兩層,每層都有一個與之關聯的EditingToolbar。

當用戶按下多邊形繪製(在EditingToolbar中)時,它正在繪製「polygon_layer」。

當用戶按下線條繪製或點繪製時,切換圖層,用戶現在繪製「矢量」圖層。

當我切換層,我需要激活的EditingToolbar,例如正確的按鈕:

用戶繪製多邊形中的「polygon_layer」,現在他想畫線。他按下畫線按鈕(在與polygon_layer關聯的EditingToolbar中)。

我切換圖層並在該圖層的EditingToolbar上激活繪製線按鈕。

過了一段時間,用戶現在想要再次繪製多邊形,所以我停用了該圖層中的所有按鈕,切換圖層並激活 EditingToolbar中的繪製多邊形按鈕以獲取polygon_layer。等等。

現在,當我做足夠多的時間(3個開關)時,我注意到按鈕不再停用。

所以我試圖調試,並得到了上述完全意外的錯誤(在最上面)。

請告訴我我做錯了什麼。

我追加了我的代碼,我會在ERROR HERE這裏發生這種情況。此代碼已準備好運行。 您可以使用下面的HTML代碼,只需更改參考我提供的JavaScript文件(我提供的JavaScript文件的內容)

JS FILE: 
var map; 
var editing_toolbar_polygon=null; 
var editing_toolbar_vector=null; 
var drag_control=null; 
var vectors; 
var polygon_layer=null; 
var epsg900913 = new OpenLayers.Projection('EPSG:900913'); 
var epsg4326 = new OpenLayers.Projection('EPSG:4326'); 
//var epsg900913 = new OpenLayers.Projection('EPSG:900913'); 
// var epsg4326 = new OpenLayers.Projection('EPSG:4326'); 
var line_control; 
var polygon_control; 
var renderer; 
function initialize() { 
    line_control, renderer=OpenLayers.Util.getParameters(window.location.href).renderer; 
    renderer= (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers; 
    // Create the map object 
    map = new OpenLayers.Map('map'); 
    //Create a Google layer 
    var gmap = new OpenLayers.Layer.Google(
     "Google Streets", // the default 
     { 
      numZoomLevels: 20, 
      projection: new OpenLayers.Projection("EPSG:900913") 
     } 
    ); 
    var wms = new OpenLayers.Layer.WMS("OpenLayers WMS", 
      "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic', 
    projection: new OpenLayers.Projection("EPSG:4326")}); 

    var mystyle=new OpenLayers.StyleMap({ 
     "default": new OpenLayers.Style({ 
      fillColor: "#66ccff", 
      strokeColor: "#3399ff", 
      graphicZIndex: 2, 
      strokeWidth: 5, 
     }), 
     "temporary": new OpenLayers.Style({ 
      fillColor:"#3399ff", 
      strokeColor: "#3399ff", 
      strokeWidth:5, 
      pointRadius:10 

     })   
    }); 
    polygon_layer=new OpenLayers.Layer.Vector(
     "Polygon Layer", 
     { 
      //renderers:renderer, 
     } 
    ); 

    vectors= new OpenLayers.Layer.Vector(
     "Vector Layer", 
     { 
      //renderers:renderer, 
     } 
    ); 

    editing_toolbar_polygon=new OpenLayers.Control.EditingToolbar(polygon_layer); 
    editing_toolbar_vector=new OpenLayers.Control.EditingToolbar(vectors); 
    map.addLayers([gmap,wms,vectors,polygon_layer]); 
    map.addControl(new OpenLayers.Control.LayerSwitcher()); 
    //map.addControl(new OpenLayers.Control.MousePosition()); 
    map.addControl(editing_toolbar_polygon); 
    map.addControl(editing_toolbar_vector); 
    editing_toolbar_vector.deactivate(); 
    //for the drag control to work you need to activate it 
    drag_control=new OpenLayers.Control.DragFeature(vectors); 
    map.addControl(drag_control); 
    find_control(editing_toolbar_polygon.getControlsByClass(new RegExp(".*DrawFeature")),"Point").events.register("activate",null,function(e){ 
     //ERROR HERE 
     this.deactivate(); 
     var picked_button=find_same_control(editing_toolbar_vector.controls,e.object); 
     change_layer(polygon_layer,vectors); 
     change_control(editing_toolbar_polygon,editing_toolbar_vector); 
     picked_button.activate(); 
    }); 
    find_control(editing_toolbar_polygon.getControlsByClass(new RegExp(".*DrawFeature")),"Path").events.register("activate",null,function(e){ 
     //ERROR HERE 
     this.deactivate(); 
     var picked_button=find_same_control(editing_toolbar_vector.controls,e.object); 
     change_layer(polygon_layer,vectors); 
     change_control(editing_toolbar_polygon,editing_toolbar_vector); 
     picked_button.activate(); 
    }); 
    find_control(editing_toolbar_vector.getControlsByClass(new RegExp(".*DrawFeature")),"Polygon").events.register("activate",null,function(e){ 
     //ERROR HERE 
     this.deactivate(); 
     var picked_button=find_same_control(editing_toolbar_polygon.controls,e.object); 
     change_layer(vectors,polygon_layer); 
     change_control(editing_toolbar_vector,editing_toolbar_polygon); 
     picked_button.activate(); 
    }); 
    polygon_layer.events.register("beforefeatureadded",null,function(e){ 
      polygon_layer.removeAllFeatures(); 
    }); 
    // line_control=new OpenLayers.Control.DrawFeature(vectors,OpenLayers.Handler.Path); 
    //polygon_control=new OpenLayers.Control.DrawFeature(vectors,OpenLayers.Handler.RegularPolygon); 
    //map.addControl(line_control); 
    //line_control.activate(); 
    //map.addControl(polygon_control); 
    //polygon_control.activate(); 
    // Zoom to Vancouver, BC 
    map.setCenter(new OpenLayers.LonLat(-123.12, 49.28).transform(epsg4326, epsg900913), 13);   

} 

function change_layer(current_layer,next_layer){ 
    current_layer.setVisibility(false); 
    next_layer.setVisibility(true); 
} 
function change_control(current_control,next_control){ 
    current_control.deactivate(); 
    map.addControl(next_control); 
} 

//use this when you want to find a specific control type: 
// DrawFeature cntrol has many types, Line, Polygon, Point. 
// So what you do is pass an array of DrawFeature controls and a type(string), lets say "Point", 
// then this function will return a DrawFeature thats specifically for drawing points 
function find_control(controls,type){ 
    var control; 
    for(var x in controls){ 
     if(controls[x].displayClass.search(new RegExp(type+"$"))>0){ 
      return controls[x]; 
     } 
    } 
    return -1; 
} 

回答

1

我只是想用一個簡單的測試。 當您取消激活控制器時,只需刪除控制器的事件。 因此,對於OpenLayers.Control.LayerSwitcher,取消激活此控制器毫無用處,因爲沒有任何更改,您仍然可以選擇一個圖層。

我認爲最好的辦法是爲你的多邊形移除控制器並添加線條。

當您選擇 「polygon_layer」:

map.addControl(editing_toolbar_polygon); 
map.removeControl(editing_toolbar_vector); 

當您選擇 「矢量」:

map.addControl(editing_toolbar_vector); 
map.removeControl(editing_toolbar_polygon); 
+0

感謝我的朋友。你所說的話是非常有意義的,除了由於某種原因它不能按預期工作。 當我這樣做:map.removeControl(editing_toolbar_polygon),然後該控件被刪除。 當我做map.addControl(editing_toolbar_polygon)時,沒有任何反應。 你知道爲什麼嗎? –

+0

我不知道爲什麼沒有發生(我在源搜索,但我不明白爲什麼)。但我認爲有兩種解決方案。首先嚐試調用控制器的「繪製」方法。如果沒有發生,請在「重繪」(http://jsfiddle.net/cwCX2)後調用。最後,最後一個解決方案是銷燬對象並在將其添加到地圖之前創建一個新對象(http://jsfiddle.net/tm9vb/)。 – GuillaumeS