Javascript 叶套布线机的撤消/重做
我正在尝试为我的工具实现简单的撤销/重做功能,该工具使用传单和传单路由机器。 以下是我的功能:Javascript 叶套布线机的撤消/重做,javascript,leaflet,leaflet.draw,leaflet-routing-machine,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(); activityB
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中的条目也会自动更新,添加另一个新航路点数组也会被推送。为什么会这样
例如:
我希望我能解释我的问题。
寻求帮助 我认为问题在于传单路由机器在某些情况下会改变现有的航路点实例,而不是总是创建新的航路点实例。例如,当拖动一个航路点时,该航路点的坐标在同一实例中被覆盖 由于您的
activityBuffer
保存了对现有航路点的引用,因此当LRM更新这些航路点时,这些航路点也将更新。相反,存储航路点副本应该可以解决您的问题
还请注意,严格来说,您应该存储传递给事件处理程序的路由中的航路点(
routeselected
),而不是获取控件的航路点-例如,当网络延迟较高时,这可能很重要。撤消/重做是一个真正解决了的问题。。。。你们看过关于它的实现的任何文章/教程吗?我找不到任何关于传单路由机器API的撤销/重做的参考资料,也找不到堆栈上的任何地方。如果你知道的话,请分享一下好吗?撤销/重做“传单发送”与其他所有操作都是一样的。在每次更改时存储状态,在撤消时恢复状态。您还保留了另一个列表用于重做(如果您想)快速谷歌搜索:我了解了它背后的逻辑,但这里的问题有点特定于传单路由机器,它覆盖了存储在缓冲区中的航路点数组。谢谢!你是对的,这就是问题所在。我通过串接waypoints数组并将其推送到我的activityBuffer来修复它。@FarhanHabib nice!请考虑将我的答案标记为正确和/或赞成:我忘了这么做。很抱歉你不得不提及。