2017-01-31 4 views
0

Ich habe eine Benutzereinstellungen Seite, die den Benutzer aus dem lokalen Speicher $localStorage.user lädt, speichert es in einer Variablen innerhalb des Bereichs self.user und ermöglicht Benutzern, Daten über ein Formular in der Ansicht zu ändern. Sobald der Benutzer mit den Änderungen zufrieden ist, wird $localStorage.user wieder durch self.user ersetzt und voila. Wenn der Benutzer von der Seite weg navigiert, sollte $localStorage.user unberührt bleiben. Aus irgendeinem Grund ändert sich jedoch auch die self.user Variable in der Ansicht $localStorage.user und ich kann nicht verstehen warum.Ändern von Daten von Via zu ändern scheint localStorage Objekt

Beispiel Anzeigen:

<label class="item item-input"> 
     <input type="text" class="ec" name="firstName" placeholder="First Name" ng-bind="{{setCtrl.user.firstName}}" ng-model="setCtrl.user.firstName" required> 
</label> 

Beispiel Controller:

self.user = $localStorage.user; // when page loads run this 

$localStorage.user = self.user; // runs when user saves 

Antwort

1

von Natur aus in Javascript-Objekte werden als Kopie seiner Referenz übergeben. Das bedeutet, dass

self.user = $localStorage.user; 

nach dem Aufruf, alle Änderungen an self.user auch $localStorage.user bedeuten ändern, denn sie auf die gleiche Speicheradresse zeigen. Sie müssen die Speicher Benutzer statt, zum Beispiel unter Verwendung von Winkeln des integrierten Kopierfunktion kopieren:

angular.copy($localStorage.user, self.user); 
+0

Alle Antworten scheinen auf das Konzept der Weitergabe als Referenz zu verweisen. Werde für die Zukunft denken, danke allen! – jablesauce

+0

(Es funktioniert übrigens) – jablesauce

1

Der Grund ist, dass Sie das Objekt bei $localStorage.user verweisen. Wenn Sie self.user = $localStorage.user; tun, sagen Sie im Grunde, dass self.user ein Alias ​​(im Speicher) von $localStorage.user ist, so ändert self.user wird auch ändern $localStorage.user.

Wie vermeide ich das? Klon $localStorage.user. Beispiel mit LoDash: self.user = _.cloneDeep($localStorage.user);

1

Seit self.user & $ localStorage.user auf das gleiche Objekt verweisen, Änderung an einem reflektiert auf der anderen Seite, so dass Sie eine tiefe Kopie machen müssen, das zu vermeiden.

Verwandte Themen