克隆后无法访问 Konva Stage children
Can't access children of Konva Stage after cloning
我对 konvajs 有疑问。我有一个 konva 舞台,我将其克隆到临时舞台中,因此当用户取消时,我可以还原用户所做的更改。
我这样做的方法是,我将现有舞台克隆到一个临时舞台,销毁原点的 children ,然后将临时舞台的 children 移回原始舞台并摧毁临时舞台。问题是,当我现在尝试访问 children 时,例如通过 findOne('#id-of-child'),我得到未定义,即使 children 存在。
这是我到目前为止所做的:
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();
},
现在,当用户打开工具箱进行更改时,会使用 "clone" 函数克隆当前阶段,当用户取消更改时,会使用克隆阶段调用 "restore" 函数作为参数。
但是在那之后,当我尝试执行以下操作时,它们无法按预期工作。
some_child_of_the_stage.getLayer(); -> returns null
var edit_layer = this.stage.findOne('#edit-layer'); -> returns undefined
但是 "some_child_of_the_stage" 确实存在并且有一层当然,舞台有一个 child,id 为 "edit-layer"。
我和我的同事束手无策。
非常感谢您的帮助和建议。
更新:
通过 console.log 显示问题的简短 fiddle:
fiddle
节点最好不要碰attrs
属性,使用publicgetter和setter
Konva
有特殊的存储逻辑id
属性。由于直接访问 attrs
id.
,id #edit-layer
的选择器可能无法工作
在这种情况下,您可以使用名称 属性。
我对 konvajs 有疑问。我有一个 konva 舞台,我将其克隆到临时舞台中,因此当用户取消时,我可以还原用户所做的更改。 我这样做的方法是,我将现有舞台克隆到一个临时舞台,销毁原点的 children ,然后将临时舞台的 children 移回原始舞台并摧毁临时舞台。问题是,当我现在尝试访问 children 时,例如通过 findOne('#id-of-child'),我得到未定义,即使 children 存在。
这是我到目前为止所做的:
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();
},
现在,当用户打开工具箱进行更改时,会使用 "clone" 函数克隆当前阶段,当用户取消更改时,会使用克隆阶段调用 "restore" 函数作为参数。 但是在那之后,当我尝试执行以下操作时,它们无法按预期工作。
some_child_of_the_stage.getLayer(); -> returns null
var edit_layer = this.stage.findOne('#edit-layer'); -> returns undefined
但是 "some_child_of_the_stage" 确实存在并且有一层当然,舞台有一个 child,id 为 "edit-layer"。
我和我的同事束手无策。
非常感谢您的帮助和建议。
更新: 通过 console.log 显示问题的简短 fiddle: fiddle
节点最好不要碰
attrs
属性,使用publicgetter和setterKonva
有特殊的存储逻辑id
属性。由于直接访问attrs
id. ,id 在这种情况下,您可以使用名称 属性。
#edit-layer
的选择器可能无法工作