2013-01-16 171 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',它也會引發錯誤。 –