He estado guardando todos los datos recibidos de los servicios directamente en la variable local, el controlador o el alcance. Lo que supongo que se consideraría una copia superficial, ¿es correcto?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Recientemente me dijeron que usara angular.copy para crear una copia profunda.
$scope.example = angular.copy(response.data);
Sin embargo, la información de copia profunda parece estar funcionando de la misma manera cuando es utilizada por mi aplicación Angular. ¿Existen beneficios específicos al usar una copia profunda (angular.copy) y, por favor, puede explicarme?
javascript
angularjs
deep-copy
shallow-copy
Superman2971
fuente
fuente
Respuestas:
Use angular.copy cuando asigne el valor del objeto o matriz a otra variable y ese
object
valor no debe cambiarse.Sin una copia profunda o utilizando angular.copy , cambiar el valor de la propiedad o agregar cualquier propiedad nueva actualiza todos los objetos que hacen referencia a ese mismo objeto.
fuente
$scope.one = response.data
y conjunto$scope.two = response.data
. Entonces hazlo$scope.two.addProperty = something
. Probablemente debería probar esto :) pero me encantaría obtener información de la comunidad.object property
actualizar el nuevo valor a todos los objetos que tengan la misma referencia. Es por eso que tienes que usar angular.copyEn ese caso, no necesita usar
angular.copy()
Explicacion :
=
representa una referencia mientras queangular.copy()
crea un nuevo objeto como una copia profunda.Usar
=
significaría que cambiar una propiedad deresponse.data
cambiaría la propiedad correspondiente de$scope.example
o viceversa.El uso de
angular.copy()
los dos objetos permanecería separado y los cambios no se reflejarían entre sí.fuente
Yo diría que
angular.copy(source);
su situación es innecesaria si más tarde no la usa sin un destinoangular.copy(source, [destination]);
.https://docs.angularjs.org/api/ng/function/angular.copy
fuente
angular.copy()
un objeto para evitar que otro código lo modifique. El objeto original puede cambiar, pero su copia no verá los cambios. Puede restablecer la copia si es necesario.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.
y un controlador que usa este servicio,
Cuando se ejecuta el programa anterior, la salida será la siguiente:
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.
fuente
Sé que ya ha respondido, pero solo estoy tratando de hacerlo simple. Entonces angular.copy (datos) puede usar en caso de que desee modificar / cambiar su objeto recibido manteniendo sus valores originales sin modificar / sin modificar.
Por ejemplo: supongamos que hice una llamada a API y obtuve mi OriginalObj, ahora quiero cambiar los valores de api originalObj en algún caso, pero también quiero los valores originales, así que lo que puedo hacer es hacer una copia de mi api originalObj en duplicateObj y modifique duplicateObj de esta manera mis valores originalesObj no cambiarán. En palabras simples, la modificación duplicateObj no se reflejará en originalObj a diferencia de cómo se comporta js obj.
El resultado es como ...
fuente
Solo estoy compartiendo mi experiencia aquí, utilicé angular.copy () para comparar las propiedades de dos objetos. Estaba trabajando en varias entradas sin elemento de formulario, me preguntaba cómo comparar las propiedades de dos objetos y, en función del resultado, tengo que habilitar y deshabilitar el botón Guardar. Así que usé como a continuación.
Asigné un valor de usuario de objeto de servidor original a mi objeto ficticio para decir userCopy y usé watch para verificar los cambios en el objeto de usuario.
La API de mi servidor que me proporciona datos del servidor:
No estoy seguro, pero comparar dos objetos fue realmente un dolor de cabeza para mí siempre, pero con angular.copy () fue sin problemas.
fuente
Javascript pasa variables
by reference
, esto significa que:Ahora, debido a que
by reference
partei
es [1], y tambiénj
es [1], aunque soloi
se modificó. Esto se debe a que cuando decimos quej = i
javascript no copia lai
variable y la asigna,j
sino que hace referencia a lai
variablej
.La copia angular nos permite perder esta referencia, lo que significa:
Ahora
i
aquí es igual a [1], mientras quej
todavía es igual a [].Hay situaciones en las que este tipo de
copy
funcionalidad es muy útil.fuente
angular.copy
es más inteligente que la serialización JSON porque puede manejar funciones.