如何在Angular UI树中克隆节点?

时间:2017-06-11 21:26:10

标签: javascript angularjs angular-ui-tree

如何在Angular UI树中克隆所有孩子的节点?

现在我使用事件点击:ng-click="newSubItem(this)"其中newSubItem是函数:

$scope.newSubItem = function (scope) {

                var nodeData = scope.$modelValue;
                var arrr_nodes = [];

                angular.forEach(nodeData.nodes, function (value) {
                    arrr_nodes.push(arrr_nodes);
                });

                var total_nodes = nodeData.nodes.length;
                var prefix_increment = total_nodes + 1;

                nodeData.nodes.push({
                    id: nodeData.id + prefix_increment,
                    prefix: nodeData.prefix + "_" + prefix_increment,
                    title: nodeData.title + '.' + (nodeData.nodes.length + 1),
                    value: nodeData.value,
                    type: nodeData.type,
                    nodes: arrr_nodes
                });
            };

当我尝试将克隆对象中的所有子项插入新nodes: nodes: arrr_nodes时,会出现很多错误并中断树。

1 个答案:

答案 0 :(得分:1)

我并不完全清楚你在newSubItem函数中尝试做什么 - 它没有返回任何内容,所以它并不明显是什么目的是。

但是你没有克隆对象,而是你

  • 复制对象引用(nodeData只是对scope.$modelValue的引用,因此如果modelValue稍后更改,那么nodeData)和
  • 创建循环数据结构(通过将数组推送到自身,arrr_nodes.push(arrr_nodes);),

这两者都不是你想要的。

要回答您提出的问题,如果您尝试对某个对象进行深层克隆,Angular会提供angular.copy()这样做。如果您的目的是让nodeData成为modelValue的克隆,那么您只需要

$scope.newSubItem = function (scope) {
    var nodeData = angular.copy(scope.$modelValue);
    // presumably now you would do something useful with nodeData
}