一个ArcGIS Javascript API的BUG和处理办法 - 调用两次Draw工具条deactivate方法导致的错误

最近开始尝试用ArcGIS Server 9.3的Javascript API进行WebGIS系统的开发,这个项目需要实现矢量要素的编辑功能,同时我们又不希望使用ADF进行开发,因此需要自己来实现一些简单的地图编辑功能。还好需求只是对简单的点图层进行编辑,而这个功能早在ArcIMS时代我们就已经搞定了。现在有了Javascirpt API,更加方便我们开发编辑功能。

我们对地图控件进行了配置,使其体验与桌面的编辑功能类似,即点击编辑,弹出编辑工具条,然后选择所要编辑的图层,往上面添加点。整个逻辑已经重复了很多很多遍了。在编辑的过程中,用户还可能使用放大缩小等浏览控件来对地图进行范围上的更新。

为了尽量的减少开发量,我们使用了Javascirpt API内置的Draw工具条和Navigation工具条。在编辑的时候激活Draw工具条,在浏览的时候激活Navigation工具条,这个逻辑也没有问题。

但是问题很快出现了,在用户处于编辑状态时,如果需要放大地图,则要点击放大按钮,这时需要调用DrawToolbar的deactivate方法,如果再次启动则调用activate(...)方法,这逻辑上也没问题,但今天调试的时候发现一个bug,即如果用户点击了放大按钮,我们调用了DrawToolbar的deactivate方法,而后用户又点击了缩小按钮或漫游按钮,DrawToolbar的deactivate方法被再次调用,这时鼠标与地图的交互就出现了问题,拉框矩形并没有随着鼠标移动的轨迹正确的移动。经调试发现这个bug只在多次调用DrawToolbar的deactivate方法时出现。

于是迅速的查了一下Javacript api的sdk,看有没有DrawToolbar的某个属性表明当前是激活还是未激活状态的属性,可惜是没有,那么我们就只有用一个全局的变量来标识当前DrawToolbar的状态了,于是,如下的代码可以绕过这个比较明显的bug:

// 是否启用Draw工具条
var  EnableDraw  =   false ;
// 激活绘制图形工具条(Workaround:因为它没有属性表明状态,所以用一个全局变量来对其状态进行标识)
function  ActivateDrawToolbar()
{
    console.log(EnableDraw);
    
if  (EnableDraw  ===   true )
    {
        
return ;
    }
    
else
    {
        EnableDraw 
=   true ;
        drawToolbar.activate(esri.toolbars.Draw.POINT);
    }
    console.log(EnableDraw);
}
// 停止绘制图形工具条(Workaround:因为它没有属性表明状态,所以用一个全局变量来对其状态进行标识)
function  DeactivateDrawToolbar()
{
    console.log(EnableDraw);
    
if  (EnableDraw  ===   true )
    {
        drawToolbar.deactivate();
        EnableDraw 
=   false ;
    }
    
else
    {
        
return ;
    }
    console.log(EnableDraw);
}

记录下来免得大家犯类似的错误。

 

你可能感兴趣的:(JavaScript)