Fix/同一张图片复制粘贴再重进画布副本会消失 #131
Reference in New Issue
Block a user
Delete Branch "fix/copy-pasted-on-canva"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
原因: 画布复制逻辑曾为副本生成
local-resource-copy-*,但没有创建对应项目资源;自动保存虽然触发,结构化画布会拒绝缺资源引用,legacy 快照刷新时也无法 hydrate 副本。(layout描述在哪, resource 描述画什么)
解决方法:
让新的副本(a layout)引用同一个resourceId, 并在原layout的引用未准备好时禁用对它的复制(简化了逻辑)
before:


after:
把所有 local-* 都误判成“素材仍在保存”
ImageCanvasLayerCommandModel.ts:52 会永久禁止复制所有 local-* 图层。但仓库明确支持无资源行的历史角色动作序列,前端也会从持久化帧直接恢复;这些图层不会再回填正式 ID。结果是复制、剪切、创建副本永久禁用,快捷键却一直提示“请稍后重试”。
应依据真实在途登记状态判断,或先迁移/单独处理合法历史序列,不能只看 ID 前缀。
更准确地说:不是“永远不可能迁移”,而是正常的打开、保存链路不会自动回填正式 ID;只有显式修复或迁移流程才可能改变它。
这类历史角色动作是一个兼容例外:
后端允许它没有 editor_project_resource 资源行,只要布局自身保存了完整图片序列帧。
前端打开项目时,hydrateLayer 直接用第一帧恢复图层,不要求找到资源行。
加载项目只是直接设置这些图层;createProjectResourceForLayer 只会处理新追加到画布的本地图层,不会扫描并补登记已加载的历史图层。
因此它虽然叫 local-,实际上已经是持久化终态,并不存在一个等待中的请求会返回正式 ID。
所以 local- 当前有两种含义:
新增素材正在登记,稍后会回填正式 ID。
历史角色动作兼容数据,正常使用中永远保持本地 ID。
PR 把两者统一解释成第一种,才会产生永久显示“素材仍在保存”的问题。即使产品决定不支持复制第二种,也应明确提示“历史素材暂不支持复制”,或者先迁移成正式资源,而不是让用户无限等待。
这个在已合并的 #117 里解决了, 现在 local-* 明确都是临时图层
关闭原因:
bac8111d99与 merge-basea03f13d0a5的 tree 完全一致,三点 diff 为空。7f18f7ce04进入 master,当前 master 已包含最终实现。因此按“修复已由 master 吸收,PR 无剩余净差异”关闭,不会丢失尚未合并的代码。
666
Pull request closed