Angular.copy()并不会复制所有属性。

4

考虑一个服务中的以下函数:

$scope.addPeriod = function(newPeriod) {        
        if(newPeriod.from !== '' && newPeriod.until !== '') {           
            var index = $scope.newPeriods.indexOf(newPeriod);       
            $scope.newPeriods.splice(index, 1); 
            $scope.setHolidayEditions(newPeriod);


            console.log("Check period");
            console.log(newPeriod); // state 1: object newPeriod is as expected, it contains holidayEdtions

            console.log("Check period copy");
            console.log(angular.copy(newPeriod)); //state 2 : object newPeriod is missing the holidayeditions!
            $scope.periods.push(angular.copy(newPeriod)); //original code
            //some more logic irrelevant to the question
        }
}

问题出在angular.copy()函数上。新的newPeriod对象结构如下:
它有一个“from”日期和一个“until”日期,以及一个杂志对象数组。然后有一个名为$scope.setHolidayEditions(newPeriod)的函数。基本上,它向每个杂志添加了一组版本对象。这个函数是有效的。我知道这是因为控制台输出。在原始代码中,期间随后被推入一个期间数组中,然后在屏幕上显示。很可能是为了避免引用问题,进行了angular.copy()操作。
但是,angular.copy()似乎没有复制杂志对象中新建的版本数组。这是为什么呢?
基本上,服务函数中发生了以下情况:
我有一个名为newPeriod的对象,大致如下:
{
  from:"02/10/2015", 
  until:"09/10/2015",
  magazines: [
           {title:"some title", number:"some number", code:"magazineCode"},
           {title:"other title", number:"other number", code:"magazineCode2"}
  ]
}

在执行函数$scope.setHolidayEditions(newPeriod)之后,该对象的样子如下:

    {
          from:"02/10/2015", 
          until:"09/10/2015",
          magazines: [
                   {title:"some title", number:"some number", code:"magazineCode", holidayEditions:["date","date","date"]},
                   {title:"other title", number:"other number", code:"magazineCode2", holidayEditions:["date","date","date"]}
          ]
}

但在 angular.copy(newPeriod) 之后,对象再次变成了这样:
 {
      from:"02/10/2015", 
      until:"09/10/2015",
      magazines: [
               {title:"some title", number:"some number", code:"magazineCode"},
               {title:"other title", number:"other number", code:"magazineCode2"}
      ]
    }

angular.copy()没有复制杂志的holidayEditions数组。我想知道为什么?


请提供更多上下文。 - Daniel A. White
2
代码中没有任何异常,不会出现这样的问题。创建演示以复制此问题。 - charlietfl
我必须在家里完成这个任务,因为我需要继续进行我的开发工作。显然,我不能简单地复制公司的代码 :-)。 - ocket-san
1个回答

7
您是正确的,我之前也遇到了同样的问题。因此(还有其他一些原因),我决定使用lodash来解决这个问题:lodash提供了一个针对此问题的函数: _.cloneDeep(value, [customizer], [thisArg]) 创建value的深度克隆。如果提供了自定义程序,则调用它以生成克隆值。如果自定义程序返回undefined,则方法处理克隆。自定义程序绑定到thisArg并使用最多三个参数调用; (value [, index|key, object])
注意:此方法基于结构化克隆算法。将参数对象和由Object以外的构造函数创建的对象的可枚举属性克隆到普通Object对象中。对于无法克隆的值,例如函数DOM节点、Maps、Sets和WeakMaps,返回一个空对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接