2017-01-31 42 views
0

我有一个用户设置页面,从本地存储加载用户​​,将其存储在self.user范围内的变量,并允许用户通过视图上的表单修改数据。一旦用户对变化感到满意,​​将再次被self.user代替,并且瞧。如果用户离开页面,​​应该保持不变。不过由于某些原因,在视图上更改self.user变量也似乎在变化​​,我不明白为什么。从通过更改数据似乎是修改localStorage对象

实施例视图:

<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> 

实施例控制器:

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

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

回答

1

从本质上讲,在Javascript对象作为其引用的副本传递。这意味着,调用

self.user = $localStorage.user; 

后,以self.user任何更改也将意味着改变​​,因为它们指向同一个内存地址。你需要使用的角度内置的复制功能来复制存储而不是用户,例如:

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

所有的答案似乎都指向传递引用的概念。谨记未来,谢谢大家! – jablesauce

+0

(它的工作方式) – jablesauce

1

的原因是你在​​引用的对象。当你做self.user = $localStorage.user;你基本上是说self.user是​​的别名(在内存中),所以改变self.user也会改变​​。

如何避免这种情况?克隆​​。例如与LoDash: self.user = _.cloneDeep($localStorage.user);

1

由于self.user & $ localStorage.user都指向同一个对象,一个修改将反映到其他,所以你必须做出深刻的副本,以避免这种情况。