Werfen wir zun?chst einen Blick auf den Beispielcode
<body ng-app="app">
<div ng-controller="CopyController">
<div>
data: <input ng-model="user.data" /><br>
user.data: {{user.data}} <br>
user1.data: {{user1.data}} <br>
<button ng-click="changeData1()">change</button> <br>
<button ng-click="copy()">copy</button> <br>
copyData: {{copyUser.data}}
</div>
</div>
<script src="node_modules/angular/angular.min.js"></script>
</body>
<script>
angular.module('app', [])
.controller('CopyController', function ($scope) {
// body...
$scope.changeData1 = function () {
// body...
scope.user1=scope.user1=
scope.user;
$scope.user1.data = 'is changed';
}
$scope.copy = function () {
// body...
scope.copyUser=angular.copy(scope.copyUser=angular.copy(
scope.user);
}
});
</script>
Wie Sie in der obigen Demonstration sehen k?nnen, wird der Wert von copyData zu ?this“, wenn auf die Schaltfl?che ?Kopieren“ geklickt wird sind alte Daten“, hat den Wert von ?user“ erfolgreich nach ?copyUser“ kopiert.
Wenn auf die Schaltfl?che ??ndern“ geklickt wird, werden die Werte von ?user1“ und ?user“ zu ?wird ge?ndert“, der Wert von ?copyUser“ jedoch nicht ge?ndert. Wenn zu diesem Zeitpunkt der Wert im Eingabefeld ge?ndert wird, ?ndern sich die Werte von Benutzer und Benutzer1 entsprechend, was darauf hinweist, dass es sich bei den beiden tats?chlich um dieselbe Variablenreferenz handelt. Und copyUser hat sich nicht ge?ndert.
Das Prinzip von angle.copy, die bidirektionale Bindung aufheben zu k?nnen
Dies h?ngt mit der Tatsache zusammen, dass Objekte in JavaScript Referenztypen sind.
Werttypen in JavaScript
In JavaScript werden Werte in zwei Typen unterteilt: Grundwerte und Referenzwerte.
Primitive Werte: einfache Datenfelder, die im Stapel (Stack) gespeichert sind, dh ihre Werte werden direkt an der Stelle gespeichert, an der auf Variablen zugegriffen wird.
Referenzwerte: im gespeichert Heap (Heap), das hei?t, der in der Variablen gespeicherte Wert ist ein Zeiger, der auf den Speicher zeigt, in dem das Objekt gespeichert ist.
Objekte in JavaScript sind Referenzwerte, was bedeutet, dass Objekte Werte als Referenz übergeben.
Also im obigen Code:
Die Werte der Objekte $scope.user und $scope.user1 verweisen beide auf dieselbe Referenz. Bei Angular bedeutet die überwachung von Variablen?nderungen die überwachung der von ihrem Objekt referenzierten Adresse. Wenn sich also der Referenzwert des Objekts ?ndert, ?ndern sich alle darauf verweisenden Objekte entsprechend.
In Angular kann die bidirektionale Bindung also nicht direkt durch Objektzuweisung freigegeben werden. Die M?glichkeit, die bidirektionale Bindung aufzuheben, besteht also darin, ein neues Objekt zu erstellen und dann dem neuen Objekt den Wert des ursprünglichen Objekts zuzuweisen. Ist das nicht nur eine tiefe Kopie in JavaScript?
Ja, angle.copy ist die von Angular bereitgestellte Deep-Copy-Methode. Daher kann das über angle.copy kopierte Objekt mit dem ursprünglichen Objektwert übereinstimmen und nicht auf dieselbe Referenz wie das alte Objekt verweisen, wodurch die bidirektionale Bindung der Objektvariablen realisiert wird.