【发布时间】:2020-04-09 01:05:13
【问题描述】:
为了实现撤消/重做功能,我构建了一个数组“history”,其中填充了基于canvas.on() 事件的最新更改。
console.log 转储:
History:
(3) […]
0: Object { target: {…} } //first object added
1: Object { e: mouseup, target: {…}, transform: {…}, … } //first object modified
2: Object { target: {…} } //another object added
length: 3
要退回更改堆栈,我想使用history[step].target,它包含现阶段修改后的对象 (step)。
我现在正在寻找一种方法来覆盖 fabric 对象数组中的一个对象。
canvas.item(0) 函数给出了当前画布上位置 0 的对象,但我如何用不同的对象(来自 history[].target 数组)覆盖该对象?
注意:我为撤消/重做找到的解决方案似乎是基于将整个画布序列化为 JSON 并将其保存到 JSON 数组中。我不想这样做,因为总是序列化/反序列化带有 x 个对象的整个画布似乎有点简单,只是为了撤消一个小的更改,并且历史记录包含许多关于更改的内容和对象等的有用信息。
注意 2:当然我可以先 canvas.remove(canvas.item(0)) 然后 canvas.add(history[x].target),但是不幸的是,当有多个对象时,这会弄乱我的对象堆栈,因为 canvas.item(1) 变为 canvas.item(0) 并且还原的更改现在变为 @ 987654333@(或 2、3... 等,具体取决于画布上的项目数量)。然后,当我根据对象堆栈中的位置显示对象列表时,它会重新排列,可能会使用户感到困惑。
【问题讨论】:
标签: javascript fabricjs