【问题标题】:Angular.copy() does not copy all propertiesAngular.copy() 不会复制所有属性
【发布时间】:2015-10-02 12:47:17
【问题描述】:

考虑服务中的以下函数:

$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 对象的结构如下:

它有一个“开始”日期和一个“截止”日期以及一系列杂志对象。然后是函数$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 数组。我想知道为什么?

【问题讨论】:

  • 请提供更多上下文。
  • 显示的代码中没有任何不规则的地方会出现这样的问题。创建复制此的演示
  • 我必须在家里做这件事,因为我应该继续我的 sprint 工作。我不能仅仅出于明显的原因复制公司代码:-)。

标签: javascript arrays angularjs


【解决方案1】:

你是对的,我前段时间遇到了同样的问题。因此(以及其他一些原因)我决定使用lodash,它为这个问题提供了一个功能:

_.cloneDeep(value, [customizer], [thisArg])

创造价值的深层克隆。如果提供了定制器,则会调用它来生成克隆值。如果定制程序返回未定义的克隆,则由该方法处理。定制器绑定到thisArg 并使用最多三个参数调用; (value [, index|key, object]).

注意:此方法大致基于结构化克隆算法。参数对象的可枚举属性和由除 Object 之外的构造函数创建的对象被克隆为普通的 Object 对象。对于不可克隆的值(例如 functionsDOM 节点、Maps、Sets 和 WeakMaps)返回一个空对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2012-01-08
    • 2015-01-22
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多