2013-01-16 46 views
50

Mi chiedo se ci sia via per evitare di copiare i riferimenti agli oggetti quando è necessario creare un oggetto semplice che abbia una matrice di oggetti incorporati. La situazione è la seguente: Ho un server che accetta un JSON e applica una logica quindi memorizza il oggetto in DB. diciamo che il mio modulo serve per salvare i team in DB. Il server accetta la squadra come json. il team ha una serie di oggetti TeamMember, il mio modulo ha un campo semplice per inserire le informazioni sui membri del team e aggiungerlo all'array teamMembers del team. Ora ecco il problema, quando aggiungo un membro del team all'elenco di array e voglio aggiungere un altro membro del team quando digito nel campo anche il membro aggiunto è cambiato! So il motivoCopia profonda di oggetti in angolare?

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

ed è perché ho messo stesso riferimento nella matrice Host quindi devo stesso oggetto aggiunto più volte. per evitare questo dovrei creare un nuovo membro membro del team, copiare tutte le proprietà teamMember e aggiungerlo alla matrice.

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

risposta

115

La tua domanda dice che vuole "evitare di copia completa", ma non sono sicuro che sia accurata. Sembra che si desidera utilizzare angular.copy, perché è necessario creare una copia del membro del team e aggiungere che alla matrice:

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

perché non basta spingere il membro del team? Perché fare una copia – landed

+12

Poiché gli oggetti JavaScript vengono passati per riferimento, se uno ha spinto il membro Team all'array e alla fine lo ha modificato, anche l'oggetto originale sarebbe stato modificato. 'var animal = {Nome: 'dog'};' quindi lo aggiungiamo a un array due volte. 'var array = []; Array.push (animale); array.push (animale); 'quindi abbiamo modificato il secondo animale all'interno dell'array. 'array [1] .Name = 'cat';' Ora, tutti gli animali sono chiamati 'cat'. 'Console.log (animal.Name); console.log (array [0]; 'Output: 'cat' per entrambi. –

0

Io personalmente uso questo:

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

Dovresti anche controllare' angular.equals', che genererà anche un errore. –

Problemi correlati