我正在尝试为我的工具实现简单的撤销/重做功能,该工具使用传单和传单路由机。 这是我的功能:
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中的条目也会自行更新,还推送了添加另一个新的航点数组。为什么呢?
我希望我解释了我的问题。 寻求帮助!
答案 0 :(得分:1)
我认为问题在于Leaflet Routing Machine在某些情况下会改变(更改)现有的路径点实例,而不是总是创建新的路点实例。例如,拖动航点时,航点的坐标将在同一实例中被覆盖。
由于您的activityBuffer
保存了对现有航点的引用,因此当LRM更新时,这些航点也会更新。存储路标点的副本应该可以解决您的问题。
另外请注意,严格来说,您应该存储传递给事件处理程序(routeselected
)的路径中的航点,而不是抓住控制的航点 - 例如,当网络延迟很高时,这可能很重要。