Pourquoi et quand utiliser angulaire.copie? (Deep Copy)
J'ai été l'enregistrement de toutes les données reçues en provenance directe de services de variable locale, le contrôleur, le ou la portée. Ce qui, je suppose, serait considérée comme une copie superficielle, est-ce correct?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Récemment on m'a dit d'utiliser angulaire.copie afin de créer une copie en profondeur.
$scope.example = angular.copy(response.data);
Toutefois, la copie en profondeur de l'information semble fonctionner de la même manière lorsqu'il est utilisé par mon Angulaire de l'application. Sont-t-il des avantages à utiliser une copie en profondeur (angulaire.copier) et pouvez-vous expliquer à moi?
- U besoin d'utiliser angulaire.copie si vous avez besoin d'une copie de l'objet (:D). Si u recevoir l'objet d'appel ajax ($http, $ressource, ...) il n'y a pas besoin de la copier. Toutefois, si vous souhaitez modifier cet objet en vue, mais garder l'original de l'objet dans une sorte de cache, vous pouvez copier.
Vous devez vous connecter pour publier un commentaire.
Utilisation angulaire.copie lors de l'affectation de la valeur d'un objet ou d'un tableau à l'autre variable et que
object
valeur ne doit pas être modifié.Sans copie en profondeur ou à l'aide de angulaire.copie, évolution de la valeur de la propriété ou de l'ajout de toute nouvelle propriété mise à jour de tous les objets référencer le même objet.
JS:
HTML:
$scope.one = response.data
et définir$scope.two = response.data
. Alors ne$scope.two.addProperty = something
. Je devrais probablement juste de tester ça 🙂 mais l'amour la communauté pour obtenir la perspicacité.object property
nouvelle mise à jour de la valeur de tous les objets ayant la même référence. C'est pourquoi vous devez utiliser angulaire.copieDans ce cas, vous n'avez pas besoin d'utiliser
angular.copy()
Explication :
=
représente une référence alors queangular.copy()
crée un nouvel objet que d'une copie en profondeur.À l'aide de
=
voudrait dire que la modification d'une propriété deresponse.data
allait changer la propriété correspondante de$scope.example
ou vice versa.À l'aide de
angular.copy()
les deux objets restent séparées, et les changements ne reflètent pas les uns sur les autres.Je dirais
angular.copy(source);
dans votre situation est inutile si vous ne l'utilisez pas sans une destinationangular.copy(source, [destination]);
.https://docs.angularjs.org/api/ng/function/angular.copy
angular.copy()
à un objet pour en empêcher d'autres de code à partir de la modifier. L'objet d'origine peut changer, mais votre copie ne verrez pas les changements. Vous pouvez rétablir la copie si nécessaire.Lors de l'utilisation angulaire.la copie, au lieu de la mise à jour de la référence, un nouvel objet est créé et affecté à la destination(si une destination est fourni). Mais il y a plus. Il y a cette chose de cool qui se passe après une copie en profondeur.
Dire que vous avez un service de l'usine qui a des méthodes qui met à jour l'usine de variables.
et un contrôleur qui utilise ce service,
Lorsque le programme ci-dessus est exécuté, la sortie sera comme suit,
Donc la chose cool à propos de l'utilisation angulaire de la copie, c'est que, les références de la destination sont réfléchies avec le changement de valeurs, sans avoir à les ré-attribuer les valeurs manuellement, encore une fois.
Je connais déjà la réponse, je suis juste essayer de faire simple.
Donc angulaire.copie(de données), vous pouvez l'utiliser dans le cas où vous souhaitez modifier/modifier votre reçu l'objet en gardant ses valeurs d'origine non modifiée/inchangés.
Par exemple: supposons que j'ai fait appel d'api et j'ai obtenu mon originalObj, maintenant, je veux changer les valeurs de l'api originalObj pour certains cas, mais je veux les valeurs d'origine, donc ce que je peux faire, je peux faire une copie de mon api originalObj dans duplicateObj et modifier duplicateObj de cette façon, mon originalObj valeurs ne changeront pas. En termes simples duplicateObj modification ne reflètent dans originalObj contrairement à comment js obj se comporter.
Résultat est comme si....
Je suis juste partage de mon expérience ici, j'ai utilisé angulaire.copier() pour comparer les deux propriétés des objets. Je travaillais sur un certain nombre d'entrées sans élément de formulaire, je me demandais comment faire pour comparer deux objets, propriétés et sur la base des résultats que j'ai pour activer et désactiver le bouton enregistrer. J'ai donc utilisé comme ci-dessous.
J'ai affecté un serveur d'origine de l'objet utilisateur les valeurs de mon objet factice-à-dire userCopy et utilisé montre pour vérifier les modifications apportées à l'objet utilisateur.
Mon serveur API qui me récupère les données à partir du serveur:
Je ne suis pas sûr, mais la comparaison de deux objets était vraiment casse-tête pour moi toujours mais angulaire.copier() il s'est bien déroulée.
Javascript transmet des variables
by reference
, cela signifie que:Maintenant, à cause de
by reference
partiei
est [1], etj
est [1] ainsi, même si seulementi
a été changé. C'est parce que quand nous disonsj = i
javascript n'est pas la copie de lai
variable et de l'attribuer àj
mais les référencesi
variable par l'intermédiaire d'j
.Angulaire copie nous permet de perdre cette référence, ce qui signifie:
Maintenant
i
ici égale à [1], tandis quej
toujours égale à [].Il existe des situations où ce genre de
copy
fonctionnalité est très pratique.angular.copy
est plus intelligent que la sérialisation JSON, car il peut traiter les fonctions.