我已经使用PrimeNg的Tree模块工作了几天,而且我一直在为我想要它做的几乎所有事情编写自定义功能。但是,我的自定义copyTo
函数中仍然存在对象引用问题,因为回调被称为后处理。
所以,我正在寻找一种优雅的方式来中断拖放处理程序,这样我就可以深度复制数据以进行更精细的控制。我觉得我应该考虑扩展课程,以便我可以覆盖插件的功能,但我不确定这是否会在升级时造成更多的伤害。
任何建议或"如何"建议非常感谢!
下面的代码采用具有已知索引的元素并将其重新插入到拖动的树中,从而从一棵树复制到另一棵树。但是,这仅适用于已知索引,并且不支持不同深度的嵌套节点。
copyToTree: any = []; // tree obj cache
staticTree: any = []; // tree obj cache
// Fires when node is dropped on copyToTree
dropOnCopyTo(event: any) {
let dragged: any = event.dragNode;
if(dragged.field_name == null) { // dragged from staticTree
// re-add copy to correct position in staticTree
let copy: any = this.deepCopy(dragged);
this.staticTree.children.splice(copy.index, 0, copy);
// Update field_name of dragged in copyToTree
dragged.field_name = 'new_' + Date.now();
}
}
答案 0 :(得分:0)
在与另一个开发人员合作之后,我们发现由于包含原始TreeNode对象引用的TreeNode.parent.children数组,我们只需要一个可以处理循环引用的正确深度副本。
public deepCopy(oldObj: any) {
// Using jquery for its extensive error checking
return $.extend(true, {}, oldObj);
}
这允许将TreeNode拼接回“from”树,而不会将对象引用绑定到它。