Ich habe alle von Diensten empfangenen Daten direkt in einer lokalen Variablen, einem Controller oder einem Bereich gespeichert. Was ich für eine flache Kopie halte, ist das richtig?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Kürzlich wurde mir gesagt, ich solle angle.copy verwenden, um eine tiefe Kopie zu erstellen.
$scope.example = angular.copy(response.data);
Die Deep-Copy-Informationen scheinen jedoch auf die gleiche Weise zu funktionieren, wenn sie von meiner Angular-Anwendung verwendet werden. Gibt es bestimmte Vorteile bei der Verwendung einer tiefen Kopie (angle.copy) und können Sie sie mir bitte erklären?
javascript
angularjs
deep-copy
shallow-copy
Superman2971
quelle
quelle
Antworten:
Verwenden Sie angle.copy, wenn Sie einer anderen Variablen den Wert eines Objekts oder Arrays zuweisen. Dieser
object
Wert sollte nicht geändert werden.Ohne tiefes Kopieren oder Verwenden von angle.copy werden durch Ändern des Eigenschaftswerts oder Hinzufügen einer neuen Eigenschaft alle Objekte aktualisiert , die auf dasselbe Objekt verweisen.
quelle
$scope.one = response.data
und setzen$scope.two = response.data
. Dann mach es$scope.two.addProperty = something
. Ich sollte das wahrscheinlich nur testen :), würde aber gerne Community-Einblicke bekommen.object property
Aktualisierung des neuen Werts für alle Objekte mit derselben Referenz. Deshalb müssen Sie angular.copyIn diesem Fall müssen Sie nicht verwenden
angular.copy()
Erklärung :
=
stellt eine Referenz dar, währendangular.copy()
ein neues Objekt als tiefe Kopie erstellt wird.Die Verwendung
=
würde bedeuten, dass das Ändern einer Eigenschaft vonresponse.data
die entsprechende Eigenschaft von ändern würde$scope.example
oder umgekehrt.Die Verwendung
angular.copy()
der beiden Objekte würde getrennt bleiben und Änderungen würden sich nicht gegenseitig widerspiegeln.quelle
Ich würde sagen,
angular.copy(source);
in Ihrer Situation ist unnötig, wenn Sie später nicht verwenden, ist es ohne Zielangular.copy(source, [destination]);
.https://docs.angularjs.org/api/ng/function/angular.copy
quelle
angular.copy()
ein Objekt, um zu verhindern, dass anderer Code es ändert. Das ursprüngliche Objekt wird möglicherweise geändert, aber Ihre Kopie sieht die Änderungen nicht. Sie können die Kopie bei Bedarf wiederherstellen.Bei Verwendung von angle.copy wird anstelle der Aktualisierung der Referenz ein neues Objekt erstellt und dem Ziel zugewiesen (sofern ein Ziel angegeben ist). Aber es gibt noch mehr. Es gibt diese coole Sache, die nach einer tiefen Kopie passiert.
Angenommen, Sie haben einen Factory-Service mit Methoden zum Aktualisieren von Factory-Variablen.
und eine Steuerung, die diesen Dienst verwendet,
Wenn das obige Programm ausgeführt wird, lautet die Ausgabe wie folgt:
Das Coole an der Verwendung von Winkelkopien ist daher, dass die Referenzen des Ziels bei der Änderung der Werte wiedergegeben werden, ohne dass die Werte erneut manuell zugewiesen werden müssen.
quelle
Ich weiß, dass es bereits beantwortet wurde, aber ich versuche nur, es einfach zu machen. Angular.copy (Daten) können Sie also für den Fall verwenden, dass Sie Ihr empfangenes Objekt ändern möchten, indem Sie seine ursprünglichen Werte unverändert lassen.
Zum Beispiel: Angenommen, ich habe einen API-Aufruf getätigt und mein originalObj erhalten. Jetzt möchte ich die Werte von api originalObj für einige Fälle ändern, aber ich möchte auch die ursprünglichen Werte, damit ich eine Kopie meines api originalObj erstellen kann in duplicateObj und ändern Sie duplicateObj auf diese Weise. Meine ursprünglichenObj-Werte ändern sich nicht. In einfachen Worten, die Änderung von duplicateObj spiegelt sich in originalObj nicht wider, anders als sich js obj verhält.
Ergebnis ist wie ....
quelle
Ich teile nur meine Erfahrungen hier, ich habe angle.copy () verwendet, um zwei Objekteigenschaften zu vergleichen. Ich habe an einer Reihe von Eingaben ohne Formularelement gearbeitet, mich gefragt, wie ich zwei Objekteigenschaften vergleichen kann, und basierend auf dem Ergebnis muss ich die Schaltfläche Speichern aktivieren und deaktivieren. Also habe ich wie unten verwendet.
Ich habe meinem Dummy-Objekt Benutzerwerte eines ursprünglichen Serverobjekts zugewiesen, um userCopy zu sagen, und habe watch verwendet, um Änderungen am Benutzerobjekt zu überprüfen.
Meine Server-API, die mir Daten vom Server abruft:
Ich bin mir nicht sicher, aber der Vergleich zweier Objekte bereitete mir immer Kopfschmerzen, aber mit angle.copy () lief es reibungslos.
quelle
Javascript übergibt Variablen
by reference
, dies bedeutet, dass:Jetzt ist wegen
by reference
Teili
[1] undj
ist auch [1], obwohl nuri
geändert wurde. Dies liegt daran, dassj = i
Javascript diei
Variable nicht kopiert und zuweist,j
sondern auf diei
Variable verweistj
.Durch die Winkelkopie verlieren wir diese Referenz, was bedeutet:
Jetzt ist
i
hier gleich [1], währendj
immer noch gleich [] ist.Es gibt Situationen, in denen solche
copy
Funktionen sehr praktisch sind.quelle
angular.copy
ist intelligenter als die JSON-Serialisierung, da sie Funktionen verarbeiten kann.