2013-01-16 11 views
50

Zastanawiam się, czy jest tam daleko, aby uniknąć kopiowania odniesień do obiektów, gdy trzeba utworzyć prosty obiekt, który ma tablicę osadzonych obiektów. Sytuacja wygląda następująco: mam serwer, który akceptuje JSON i stosuje jakąś logikę, a następnie przechowuje obiekt w DB. powiedzmy, że mój formularz służy do zapisywania zespołów w DB. Serwer akceptuje zespół jako json. zespół ma tablicę obiektów TeamMember, moja forma ma proste pole do wpisania informacji o członkach zespołu i dodania go do tablicy teamMembers zespołu. Teraz jest problem, kiedy dodaję członka zespołu do listy tablic i chcę dodać kolejnego członka zespołu, kiedy wpisuję w pole, zmienia się także dodany członek! Wiem PowodemObiekty głęboko kopiujące w kanciastym?

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

a to dlatego, że sam umieścić odniesienie do tablicy teamMembers więc muszę sam obiekt dodaje kilka razy. Aby tego uniknąć, powinienem utworzyć nowy obiekt członkowski zespołu, skopiować wszystkie właściwości teamMember i dodać tablicę.

Odpowiedz

115

Twoje pytanie mówi, że chcesz "unikać głębokiej kopii", ale nie jestem pewien, czy to jest dokładne. Brzmi to jak chcesz po prostu użyć angular.copy, ponieważ trzeba utworzyć kopię członka zespołu i dodać, że do tablicy:

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

dlaczego nie wystarczy wcisnąć pracy w grupie? dlaczego zrobić kopię – landed

+12

Ponieważ obiekty JavaScript są przekazywane przez odniesienie, jeśli jeden z nich przesunął element teamMember do tablicy i ewentualnie zmodyfikował go, wówczas oryginalny obiekt również zostałby zmodyfikowany. 'var animal = {Name: 'dog'};' następnie dodamy go do tablicy dwa razy. 'var tablica = []; array.push (zwierzę); array.push (animal); 'następnie zmodyfikowaliśmy drugie zwierzę w tablicy. 'tablica [1] .Name = 'cat';' Teraz wszystkie zwierzęta są nazywane 'cat'. 'console.log (animal.Name); console.log (array [0]; 'Dane wyjściowe: 'cat' dla obu: –

0

Osobiście korzystam z tego:

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

Powinieneś również sprawdzić' angular.equals', co spowoduje również zgłoszenie błędu. –

Powiązane problemy