用于传单路由机的撤消/重做

时间:2018-04-17 09:43:20

标签: javascript leaflet leaflet.draw leaflet-routing-machine

我正在尝试为我的工具实现简单的撤销/重做功能,该工具使用传单和传单路由机。 这是我的功能:

var activityBuffer = [];
var undoFlag = false;

Routing.on('routeselected', function(){
  if (undoFlag) {
     undoFlag = false;
  }
  else {
    var newWaypoints = Routing.getWaypoints();
    activityBuffer.push(newWaypoints);
    console.log(activityBuffer);
  }
});

function undoActivity(){
  var lastStateIndex = activityBuffer.length - 2
     if (lastStateIndex >= 0) {
        var oldState = activityBuffer[lastStateIndex];
        Routing.setWaypoints(oldState);
        activityBuffer.splice( activityBuffer.length -  1, 1);
        undoFlag = true;
        console.log(activityBuffer);
     }
}

如果我只是添加更多点并且路由选择的事件被触发,它工作正常,但问题是当我移动我的路点并且相同点的坐标被更改时,该路点的activityBuffer中的条目也会自行更新,还推送了添加另一个新的航点数组。为什么呢?

例如:enter image description here

enter image description here

我希望我解释了我的问题。 寻求帮助!

1 个答案:

答案 0 :(得分:1)

我认为问题在于Leaflet Routing Machine在某些情况下会改变(更改)现有的路径点实例,而不是总是创建新的路点实例。例如,拖动航点时,航点的坐标将在同一实例中被覆盖。

由于您的activityBuffer保存了对现有航点的引用,因此当LRM更新时,这些航点也会更新。存储路标点的副本应该可以解决您的问题。

另外请注意,严格来说,您应该存储传递给事件处理程序(routeselected)的路径中的航点,而不是抓住控制的航点 - 例如,当网络延迟很高时,这可能很重要。