【问题标题】:Undo/Redo for leafet routing machine传单路由机的撤消/重做
【发布时间】:2018-04-17 09:43:19
【问题描述】:

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

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);
     }
}

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

例如:

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

【问题讨论】:

  • 撤消/重做是一个真正解决的问题....你看过任何关于其实现的文章/教程吗?
  • 我找不到任何有关传单路由机器 API 或堆栈上任何位置的撤消/重做的参考。知道的可以分享一下吗?
  • “传单路由”的撤消/重做与其他所有内容相同。您存储每次更改的状态,并在撤消时恢复它。您还保留另一个重做列表(如果您愿意)
  • 我明白了它背后的逻辑,但这里的问题有点特定于传单路由机器,它会覆盖存储在缓冲区中的航点数组。

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢每!你是对的,这就是问题所在。我通过对航点数组进行字符串化然后将其推送到我的活动缓冲区来修复它。
  • @FarhanHabib 不错!请考虑将我的答案标记为正确和/或赞成:)
  • 当然!我忘了这样做。抱歉,您不得不提及。
猜你喜欢
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多