我想使用代码来清除 Blockly 工作区,并在某些情况下用新的 Blockly XML 覆盖。然而,我面临的问题是Workspace.clear()
将当前项目移动到垃圾箱,这在尝试重置工作区或用块覆盖它时可能会很烦人(这意味着首先清除它,否则当前块将被覆盖)。我发现我可以用 清除垃圾桶workspace.trashcan.contents = []
,但这会导致盖子渲染出现一些意外行为,尽管盖子是空的,但盖子看起来有点半开着。
即使我能找到清除垃圾箱的方法,这仍然会导致清除其中所有以前的项目,而我所寻找的只是在不影响垃圾箱的情况下进行一次清除操作。我试过查看文档Workspace.Clear
,但他们似乎没有给出任何语义方式来做到这一点。我也试过用 循环Workspace.getTopBlocks()
,Events.Delete
但这也会导致将项目移动到垃圾桶。
我还尝试实施手动解决方案,类似于:
const contentsBeforeClearing = workspace.trashcan.contents_;
workspace.clear();
workspace.trashcan.contents_ = contentsBeforeClearing;
对于第一行,我也尝试过Object.assign([], workspace.trashcan.contents_)
and workspace.trashcan.contents_.slice()
,但在所有三种情况下(包括最上面的情况),最终结果都等同于简单地调用workspace.clear
. 我猜这与 getter-setter 操作contentsBeforeClearing
有关(因为如果您在清除后在控制台中测试变量的值已更改以删除块),但如何解决这个问题超出了我的范围.
如何在不操作(不仅仅是重置)垃圾桶内容的情况下清除工作区?