2

我正在玩 Kinetic,似乎无法弄清楚为什么我正在克隆的组不会出现。

小提琴:http: //jsfiddle.net/DgwLd/3/

我可以克隆形状没问题 - 它只是不出现的组。文档确认可以克隆组,所以我不确定这里有什么。这是小提琴的代码:

//group and original circle - appears fine
layer.add(new Kinetic.Group({id: 'group'}));
stage.get('#group')[0].add(new Kinetic.Circle({
    fill: 'orange',
    x: 200,
    y: 50,
    radius: 30
}));

//clone of group at different Y pos - doesn't appear
layer.add(stage.get('#group')[0].clone({y: 120}));

更新- 似乎克隆一个组不会进行深层复制。这可以通过控制台记录组来验证 -console.log(stage.get('#group2'))你会看到它的children集合是空的)。这是一个错误吗?不知道您为什么要克隆没有其成员的组。

有什么想法吗?提前致谢。

4

1 回答 1

1

似乎您自己弄清楚了-确实,进行组克隆,或者实际上是任何容器的克隆,都会执行浅拷贝。

实际上,查看源代码可能比其他任何东西都提供更多信息:

clone: function(obj) {
    // instantiate new node
    var classType = this.shapeType || this.nodeType;
    var node = new Kinetic[classType](this.attrs);

    /*
     * copy over user listeners
     */
    for(var key in this.eventListeners) {
        var allListeners = this.eventListeners[key];
        for(var n = 0; n < allListeners.length; n++) {
            var listener = allListeners[n];
            /*
             * don't include kinetic namespaced listeners because
             *  these are generated by the constructors
             */
            if(listener.name.indexOf('kinetic') < 0) {
                // if listeners array doesn't exist, then create it
                if(!node.eventListeners[key]) {
                    node.eventListeners[key] = [];
                }
                node.eventListeners[key].push(listener);
            }
        }
    }

    // apply attr overrides
    node.setAttrs(obj);
    return node;
}

如您所见,它所做的只是使用当前节点的属性实例化一个新节点,然后复制事件侦听器。这可能是设计使然 - 通常您希望采用阻力最小的路径,并且当您认为该.clone()方法适用于任何通用节点(它不是专门用于容器)时,这种实现是可以的。

不过,似乎确实应该有一种.deepclone()专门用于容器的方法。也许是这样的:

deepclone: function(obj) {
    var node = this.clone(obj);

    if (this.children) {
        for (var i = 0; i < this.children.length; i++) {
            node.add(this.children[i].clone();
        }
    }

    return node;
}
于 2012-08-28T15:44:36.567 回答