J'ai enregistré toutes les données reçues des services directement dans la variable locale, le contrôleur ou l'étendue. Ce que je suppose serait considéré comme une copie superficielle, est-ce exact?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Récemment, on m'a dit d'utiliser angular.copy pour créer une copie profonde.
$scope.example = angular.copy(response.data);
Cependant, les informations de copie profonde semblent fonctionner de la même manière lorsqu'elles sont utilisées par mon application Angular. Y a-t-il des avantages spécifiques à utiliser une copie profonde (angular.copy) et pouvez-vous me les expliquer?
javascript
angularjs
deep-copy
shallow-copy
Superman2971
la source
la source
Réponses:
Utilisez angular.copy lors de l'affectation de la valeur de l'objet ou du tableau à une autre variable et cette
object
valeur ne doit pas être modifiée.Sans copie complète ou en utilisant angular.copy , la modification de la valeur de la propriété ou l'ajout de toute nouvelle propriété met à jour tous les objets référençant ce même objet.
la source
$scope.one = response.data
et définir$scope.two = response.data
. Alors fais$scope.two.addProperty = something
. Je devrais probablement juste tester ceci :) mais j'aimerais avoir un aperçu de la communauté.object property
mise à jour de la nouvelle valeur pour tous les objets ayant la même référence. C'est pourquoi vous devez utiliser angular.copyDans ce cas, vous n'avez pas besoin d'utiliser
angular.copy()
Explication :
=
représente une référence tandis queangular.copy()
crée un nouvel objet en tant que copie complète.Utiliser
=
signifierait que changer une propriété deresponse.data
changerait la propriété correspondante de$scope.example
ou vice versa.L'utilisation
angular.copy()
des deux objets resterait séparée et les changements ne se refléteraient pas l'un sur l'autre.la source
Je dirais que
angular.copy(source);
dans votre situation n'est pas nécessaire si plus tard vous ne l'utilisez pas, c'est sans destinationangular.copy(source, [destination]);
.https://docs.angularjs.org/api/ng/function/angular.copy
la source
angular.copy()
un objet pour empêcher un autre code de le modifier. L'objet d'origine peut changer, mais votre copie ne verra pas les modifications. Vous pouvez rétablir la copie si nécessaire.Lorsque vous utilisez angular.copy, au lieu de mettre à jour la référence, un nouvel objet est créé et affecté à la destination (si une destination est fournie). Mais il y a plus. Il y a cette chose cool qui se produit après une copie profonde.
Supposons que vous ayez un service d'usine qui a des méthodes qui mettent à jour les variables d'usine.
et un responsable du traitement qui utilise ce service,
Lorsque le programme ci-dessus est exécuté, la sortie sera la suivante,
Ainsi, la chose intéressante à propos de l'utilisation de la copie angulaire est que les références de la destination sont reflétées avec le changement de valeurs, sans avoir à réattribuer les valeurs manuellement, à nouveau.
la source
Je sais que c'est déjà répondu, mais j'essaie juste de faire simple. Donc angular.copy (data) que vous pouvez utiliser dans le cas où vous souhaitez modifier / changer votre objet reçu en gardant ses valeurs d'origine inchangées / inchangées.
Par exemple: supposons que j'ai fait un appel à l'API et obtenu mon originalObj, maintenant je veux changer les valeurs de api originalObj pour certains cas, mais je veux aussi les valeurs d'origine, donc ce que je peux faire est, je peux faire une copie de mon api originalObj dans duplicateObj et modifiez duplicateObj de cette façon, mes valeurs originalObj ne changeront pas. En termes simples, la modification de duplicateObj ne se reflétera pas dans originalObj contrairement à la façon dont js obj se comporte.
Le résultat est comme ...
la source
Je partage juste mon expérience ici, j'ai utilisé angular.copy () pour comparer les propriétés de deux objets. Je travaillais sur un certain nombre d'entrées sans élément de formulaire, je me demandais comment comparer les propriétés de deux objets et en fonction du résultat, je dois activer et désactiver le bouton Enregistrer. J'ai donc utilisé comme ci-dessous.
J'ai affecté des valeurs utilisateur d'objet serveur d'origine à mon objet factice pour dire userCopy et utilisé watch pour vérifier les modifications apportées à l'objet utilisateur.
Mon API serveur qui me récupère les données du serveur:
Je ne suis pas sûr mais comparer deux objets a toujours été un véritable casse-tête pour moi, mais avec angular.copy (), tout s'est bien passé.
la source
Javascript passe des variables
by reference
, cela signifie que:Maintenant, à cause de la
by reference
partiei
est [1], etj
est [1] aussi bien, même si seule ai
été modifiée. En effet, lorsque nous disons quej = i
javascript ne copie pas lai
variable et ne l'affecte pas,j
mais référence lai
variable viaj
.La copie angulaire nous fait perdre cette référence, ce qui signifie:
Maintenant,
i
ici est égal à [1], tandis quej
toujours égal à [].Il y a des situations où ce type de
copy
fonctionnalité est très pratique.la source
angular.copy
est plus intelligente que la sérialisation JSON car elle peut gérer des fonctions.