Cuando se utiliza angular.copy, en lugar de actualizar la referencia, se crea un nuevo objeto y se asigna al destino (si se proporciona un destino). Pero hay más. Hay algo genial que sucede después de una copia profunda.
Supongamos que tiene un servicio de fábrica que tiene métodos que actualizan las variables de fábrica.
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;
}]);
y un controlador que usa este servicio,
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);
}]);
Cuando se ejecuta el programa anterior, la salida será la siguiente:
****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]
Por lo tanto, lo bueno de usar la copia angular es que las referencias del destino se reflejan con el cambio de valores, sin tener que reasignar los valores manualmente, nuevamente.