Openend的drawstart事件在drawend发生后触发多次

时间:2019-11-26 13:36:45

标签: javascript typescript openlayers

我正在编辑OpenLayers团队提供的measure函数,但是我遇到了一些问题。我添加了一个选项,可以在drawstart事件中用户右键单击时删除最后添加的点,但是在第一次绘制完成后,将多次触发该选项。如果我完成3张图纸,则此选项会被触发3次,依此类推。

我正在使用addEventListener('contextmenu')来触发右键单击事件,因此我尝试遵循this suggestion并添加一个{once: true}选项,但这没有用。我还尝试将此选项添加为侦听器,并在drawend事件中使用unByKey()删除侦听器,但这也没有用。

我只是不明白为什么drawstart事件被多次触发。

我的代码

let listener;
draw.on('drawstart', (evt) => {
    // set sketch
    sketch = evt.feature;

    let tooltipCoord = evt.coordinate;

    listener = sketch.getGeometry().on('change', (evt) => {
        let geom = evt.target;
        let output;
        if (geom instanceof Polygon) {
            output = formatArea(geom);
            tooltipCoord = geom.getInteriorPoint().getCoordinates();
        } else if (geom instanceof LineString) {
            output = formatLength(geom);
            tooltipCoord = geom.getLastCoordinate();
        }
        measureTooltipElement.innerHTML = output;
        measureTooltip.setPosition(tooltipCoord);
    });

    // Remove last vector with right click
    this.map.getViewport().addEventListener('contextmenu', (evt) => {
        console.log("right clicked");
        evt.preventDefault();
        draw.removeLastPoint()
    });
});

1 个答案:

答案 0 :(得分:2)

您是如何实现unByKey()的? 应该可以做这样的事情:

function detectRightclick() {
  console.log("right clicked");
  evt.preventDefault();
  draw.removeLastPoint()
}

然后,在绘制开始时:

this.map.getViewport().addEventListener('contextmenu', detectRightclick)

,并且在支出上:

this.map.getViewport().removeEventListener('contextmenu', detectRightclick)

这是假设this.map是地图,并且您总是在绘制结束时触发该绘制(考虑取消绘制而不绘制一个绘制)