【问题标题】:Can't access children of Konva Stage after cloning克隆后无法访问 Konva Stage 的子级
【发布时间】:2017-01-06 06:47:56
【问题描述】:

我对 konvajs 有疑问。我有一个 konva Stage,我克隆到一个临时 Stage,所以当用户取消时,我可以恢复用户所做的更改。 我这样做的方法是,我将现有 Stage 克隆为临时 Stage,销毁原始 Stage 的子级,然后将临时 Stage 的子级移回原始 Stage 并销毁临时 Stage。问题是,当我现在尝试访问孩子时,例如通过 findOne('#id-of-child'),即使孩子存在,我也会得到未定义。

这是我到目前为止所做的:

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为“edit-layer”的孩子。

我和我的同事都束手无策了。

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

更新: 通过 console.log 显示问题的简短小提琴: fiddle

【问题讨论】:

  • 能不能做个jsFiddle让不熟悉Konva.js的人测试一下?

标签: javascript html html5-canvas mootools konvajs


【解决方案1】:
  1. 最好不要接触节点的attrs 属性并使用公共的getter 和setter。

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

  3. 您可以在这种情况下使用 name 属性。

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

【讨论】:

  • 这解决了this.stage.findOne('#edit-layer'); 的问题,但getLayer() 函数的问题仍然存在。好像有一些缓存什么的,因为当我克隆舞台时,当我添加一个通过console.log()输出的点击事件时,它上面的元素仍然输出相同的ID。
  • 可以加个demo吗?
  • layer 在这里为空,因为你调用了stage.destroyChildren();destroy 函数将清除所有内部引用和父子关系。
  • 是的,但我在调用this.stage.destroyChildren() 之前将this.stage 克隆到tmp_stage,然后我将层从tmp_stage 移回this.stage。我真的不明白为什么在这种方法中销毁this.stage 的孩子会有这种效果。
  • 您正在调用rect.getLayer(),但rect 是对已销毁节点的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2012-08-07
  • 2011-09-08
  • 2020-06-26
  • 2016-11-11
  • 1970-01-01
相关资源
最近更新 更多