2016-08-30 39 views
0

我有一个konvajs问题。我有一个克隆阶段,我克隆到一个临时阶段,所以我可以恢复用户取消时所做的更改。 我这样做的方式是,我将现有舞台克隆为临时舞台,摧毁起源的孩子,之后我将临时舞台的孩子移回到原始舞台并摧毁临时舞台。问题是,当我尝试通过findOne('#id-of-child')来访问孩子时,即使孩子存在,我也没有定义。克隆后无法访问Konva Stage的儿童

这是我到目前为止已经完成:

clone: function() 
{ 
    var cloned_stage = this.stage.clone(); 

    Array.each(this.stage.getChildren(), function(layer, lidx) { 
    if (layer.attrs.id) { 
     // setting the id to the ones, the children had before 
     cloned_stage.children[lidx].attrs.id = layer.attrs.id; 
    } 
    }); 
    return cloned_stage; 
}, 

restore: function(tmp_stage) 
{ 
    this.stage.destroyChildren(); 

    Array.each(tmp_stage.getChildren(), function(layer, lidx) { 
    var tmp_layer = layer.clone(); 
    tmp_layer.attrs.id = layer.attrs.id; 
    tmp_layer.moveTo(this.stage); 
    }.bind(this)); 
    tmp_stage.destroy(); 
    this.stage.draw(); 
}, 

现在,当用户打开工具箱改变一些东西,目前阶段是克隆的“克隆”功能,当用户取消了他的变化, “复原”功能以克隆阶段为参数进行调用。 但之后,当我尝试做下面的事情时,他们不按预期工作。

some_child_of_the_stage.getLayer();  ->  returns null 
var edit_layer = this.stage.findOne('#edit-layer');  -> returns undefined 

但“some_child_of_the_stage”确实存在,当然有一层和舞台有id为“编辑层”一个孩子。

我和我的同事在我们的智慧结束。

我感谢您的任何帮助和建议,谢谢。

更新: 短拨弄通过的console.log显示问题: fiddle

+0

你可以做一个这样的jsfiddle人们不熟悉Konva.js可以测试? – Sergio

回答

1
  1. 最好不要去碰一个节点的attrs性能和使用公共getter和setter。

  2. Konva具有用于存储id属性特殊的逻辑。由ID为#edit-layer的选择器可能无法正常工作,因为可以直接访问attrs ID。

  3. 您可以使用该属性的名称属性。

https://jsfiddle.net/s36hepvg/12/

+0

这解决了'this.stage.findOne('#edit-layer');'但getLayer()'函数的问题仍然存在。它看起来好像有一些缓存或某些东西,因为当我克隆阶段时,当我添加通过'console.log()'输出的click事件时,它上面的元素仍然输出相同的id。 – GiftZwergrapper

+0

你可以添加演示吗? – lavrton

+0

这里是一个小提琴:https://jsfiddle.net/6fa1h9rr/ – GiftZwergrapper