Quando si utilizza angular.copy, anziché aggiornare il riferimento, viene creato un nuovo oggetto che viene assegnato alla destinazione (se viene fornita una destinazione). Ma c'è di più. C'è questa cosa interessante che succede dopo una copia profonda.
Supponiamo di disporre di un servizio di fabbrica con metodi che aggiornano le variabili di fabbrica.
angular.module('test').factory('TestService', [function() {
var o = {
shallow: [0,1], // initial value(for demonstration)
deep: [0,2] // initial value(for demonstration)
};
o.shallowCopy = function() {
o.shallow = [1,2,3]
}
o.deepCopy = function() {
angular.copy([4,5,6], o.deep);
}
return o;
}]);
e un controllore che utilizza questo servizio,
angular.module('test').controller('Ctrl', ['TestService', function (TestService) {
var shallow = TestService.shallow;
var deep = TestService.deep;
console.log('****Printing initial values');
console.log(shallow);
console.log(deep);
TestService.shallowCopy();
TestService.deepCopy();
console.log('****Printing values after service method execution');
console.log(shallow);
console.log(deep);
console.log('****Printing service variables directly');
console.log(TestService.shallow);
console.log(TestService.deep);
}]);
Quando il programma sopra viene eseguito l'output sarà il seguente,
****Printing initial values
[0,1]
[0,2]
****Printing values after service method execution
[0,1]
[4,5,6]
****Printing service variables directly
[1,2,3]
[4,5,6]
Così la cosa fredda sull'utilizzo copia angolare è che, i riferimenti della destinazione si riflettono con il cambio di valori, senza dover riassegnare manualmente i valori, di nuovo.
U bisogno di utilizzare angular.copy se avete bisogno di copia dell'oggetto (: D). Se si riceve oggetto da una chiamata ajax ($ http, $ risorsa, ...) non è necessario copiare. Se invece vuoi modificare questo oggetto in vista, ma tieni l'oggetto originale in una sorta di cache, potresti volere la copia. –