1

KinerticJS 版本:4.4.3

当我想从舞台上删除一个图层时,我遇到了这个问题。当我调用 Layer.destroy() 时,动力学在无法删除的节点上运行。我没有收到任何错误,但是 while 循环变得无限,因为循环基于子项的长度。

destroy: function (_nameSpace) {
    var parent = this.getParent(),
    stage = this.getStage(),
    dd = Kinetic.DD,
    go = Kinetic.Global;

    var tempLength
    // destroy children
    while (this.children && this.children.length > 0) {     
        this.children[0].destroy();
    }
}

在我的情况下,无法删除的对象是 Kinetic.Image。当我跟踪节点类型时,它返回一个 Shape (这是正确的)。另外,我可以从对象中追踪我想知道的所有东西......

矩形确实会被删除。

我在 fiddle 中创建了一个低级测试,并且一切正常且花花公子,所以它与我的代码有关。再一次,没有被删除的节点是一个有效的对象,那么为什么没有被删除呢?

我创建了一条错误消息,所以我不会每次都让我的浏览器崩溃:

tempLength = this.children.length
this.children[0].destroy();

if (tempLength == this.children.length) {
    throw 'item not removed ' + this.children[0].getNodeType();
}

正如你所看到的,我在销毁一个项目后立即检查孩子的长度是否发生了变化,所以我可以假设没有其他代码干扰。例如在销毁一个节点时添加一个节点。

我在这里陷入了死胡同。我希望有人可以帮助我或指出我的任何方向。无论如何,感谢您的阅读:)

4

1 回答 1

1

好的,我弄清楚了问题所在。不知何故,我将相同的 Kinetic.Image 两次添加到图层中。销毁层时,它无法删除它的子层。

我认为这是一个动力学错误。我不应该能够如此(相对)容易地打破框架。

https://github.com/ericdrowell/KineticJS/issues/434

于 2013-05-07T11:42:08.080 回答