Undo/Redo 传单路由机
Undo/Redo for leafet routing machine
我正在尝试为我的使用传单和传单路由机的工具实现简单的 undo/redo 功能。
这是我的功能:
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 事件,它工作正常,但问题是当我移动我的 waypoints 并且相同点的坐标发生变化时,该航路点的 activityBuffer 中的条目也是自己更新的,添加另一个新数组waypoints也被推送。为什么会这样?
例如:
我希望我解释了我的问题。
寻求帮助!
我认为问题在于 Leaflet Routing Machine 在某些情况下会改变(更改)现有的路点实例,而不是总是创建新的路点实例。例如拖动航点时,同一实例覆盖航点的坐标。
由于您的 activityBuffer
保存了对现有 waypoints 的引用,因此当 LRM 更新它们时,这些 waypoints 也会更新。存储 waypoints 的副本应该可以解决您的问题。
另请注意,严格来说,您应该存储传递给事件处理程序 (routeselected
) 的路由中的 waypoints,而不是获取控件的 waypoints - 这可能是例如,当网络延迟很高时很重要。
我正在尝试为我的使用传单和传单路由机的工具实现简单的 undo/redo 功能。 这是我的功能:
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 事件,它工作正常,但问题是当我移动我的 waypoints 并且相同点的坐标发生变化时,该航路点的 activityBuffer 中的条目也是自己更新的,添加另一个新数组waypoints也被推送。为什么会这样?
例如:
我希望我解释了我的问题。 寻求帮助!
我认为问题在于 Leaflet Routing Machine 在某些情况下会改变(更改)现有的路点实例,而不是总是创建新的路点实例。例如拖动航点时,同一实例覆盖航点的坐标。
由于您的 activityBuffer
保存了对现有 waypoints 的引用,因此当 LRM 更新它们时,这些 waypoints 也会更新。存储 waypoints 的副本应该可以解决您的问题。
另请注意,严格来说,您应该存储传递给事件处理程序 (routeselected
) 的路由中的 waypoints,而不是获取控件的 waypoints - 这可能是例如,当网络延迟很高时很重要。