考虑服务中的以下功能:
$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数组。我想知道为什么?
答案 0 :(得分:6)
你是对的,前段时间我遇到了同样的问题。因此(以及其他一些原因)我决定使用lodash为这个问题提供一个函数:
_.cloneDeep(value, [customizer], [thisArg])
创建值的深层克隆。如果提供了自定义程序,则会调用它来生成克隆值。如果定制器返回未定义的克隆,则由该方法处理。定制器绑定到
thisArg
并最多调用三个参数;(value [, index|key, object])
。注意:此方法基于结构化克隆算法。由Object以外的构造函数创建的参数对象和对象的可枚举属性被克隆到普通的Object对象。为不可克隆的值返回一个空对象,例如 functions , DOM nodes ,Maps,Sets和WeakMaps。