2013-01-16 108 views
50

我不知道是否有避免复制对象的引用,当你需要创建一个简单的对象,其中有一个嵌入对象的数组。情况如下:我有服务器接受JSON并应用一些逻辑,然后存储DB中的对象。可以说我的表单是用DB保存团队的。服务器接受团队为json。该团队有一组TeamMember对象,我的表单有一个简单的字段用于输入团队成员信息并将其添加到团队teamMembers数组中。现在问题出在了,当我将一个团队成员添加到数组列表中并且想要添加另一个团队成员时,当我在该字段中输入时,添加的成员也会被更改!我知道原因以角度深度复制对象?

$scope.addTeamMember=function(teamMember){ 
    $scope.team.teamMembers.push(teamMember); 
} 

,这是因为我把相同的参考到teamMembers阵列,所以我有相同的对象中,增加好几倍。 为了避免这种情况,我应该创建一个新的团队成员对象,复制所有teamMember属性并将其添加到数组中。

$scope.addTeamMember=function(teamMember){ 
     var newTeamMember; /*<--- copy teamMember */ 
     $scope.team.teamMembers.push(newTeamMember); /*and add newTeamMember*/ 
    } 

回答

115

你的问题说你想“避免深层复制”,但我不确定这是否准确。这听起来像你只是想用angular.copy,因为你需要创建团队成员的副本,并添加到阵列:

$scope.addTeamMember = function(teamMember) { 
    var newTeamMember = angular.copy(teamMember); 
    $scope.team.teamMembers.push(newTeamMember); 
}; 
+1

为什么不推teamMember?为什么要复制 – landed

+12

由于JavaScript对象是通过引用传递的,如果将teamMember推送到数组并最终修改它,那么原始对象也会被修改。 'var animal = {Name:'dog'};'然后我们将它添加到一个数组两次。 'var array = [];的Array.push(动物); array.push(动物);'然后我们修改阵列中的第二个动物。 'array [1] .Name ='cat';'现在,所有的动物都被命名为'cat'。 '的console.log(animal.Name); console.log(array [0];'Output:'cat'for both。 –

0

我个人使用:

function copyObjToObj(source, destination) { 
     if(!angular.equals(source,destination)){ 
      if (!!destination) 
       angular.copy(source, destination); 
      else 
       destination = angular.copy(source); 
     } 
     return destination; 
    } 
var destination = copyObjToObj(sourceObj, destination); 
+1

你也应该检查'angular.equals',它也会引发错误。 –