KinteticJS - 破坏节点,无限循环,因为孩子没有被删除

时间:2013-05-06 13:46:14

标签: javascript html5-canvas kineticjs destroy

KinerticJS版本:4.4.3

当我想从舞台上删除一个图层时,我遇到了这个问题。当我调用Layer.destroy()时,kinetic在一个无法删除的节点上运行。我没有得到任何错误,但是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(这是正确的)。此外,我可以从对象中追踪我想知道的所有东西...

矩形确实被移除。

我在小提琴中创建了一个低级别的测试,并且一切都工作正常和花花公子,所以它与我的代码有关。再一次,未被删除的节点是一个有效的对象,为什么不被删除?

我创建了一条错误消息,因此我不会每次都崩溃浏览器:

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

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

正如你所看到的那样,如果儿童的长度发生了变化,我会在我销毁一件物品后立即检查,所以我可以假设其他代码没有干扰。例如,在销毁节点时添加节点。

我在这里死路一条。我希望有人可以帮助我,或指向任何方向。无论如何,感谢阅读:)

1 个答案:

答案 0 :(得分:1)

好的,我想出了问题所在。不知何故,我在一层上添加了两次相同的Kinetic.Image。当摧毁它时,它无法移除它的孩子。

我认为这是一个动态bug。我不应该这样(相对)容易打破框架。

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