2017-01-31 4 views
0

У меня есть страница настроек пользователя, которая загружает пользователя из локального хранилища $localStorage.user, сохраняет его в переменной в пределах области self.user и позволяет пользователям изменять данные через форму на представлении. После того, как пользователь будет удовлетворен изменениями, $localStorage.user снова будет заменен на self.user и вуаля. Если пользователь переходит от страницы, $localStorage.user должен оставаться нетронутым. По какой-то причине, однако, изменение переменной self.user на вид также, кажется, меняется $localStorage.user, и я не могу понять, почему.Изменение данных из via, похоже, изменяет объект 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 также будет означать изменение $localStorage.user, поскольку они указывают на тот же адрес памяти. Вам нужно скопировать пользователь хранения вместо этого, например, с помощью встроенной функции угловой копирует:

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

Все ответы, кажется, указывают на концепцию прохождения по ссылке. Будем помнить о будущем, спасибо всем! – jablesauce

+0

(Это работает кстати) – jablesauce

1

Причина заключается в том, что вы ссылаетесь на объекте в $localStorage.user. Когда вы делаете self.user = $localStorage.user;, вы в основном говорите, что self.user является псевдонимом (в памяти) $localStorage.user, поэтому изменение self.user также изменит $localStorage.user.

Как этого избежать? Клон $localStorage.user. Пример с LoDash: self.user = _.cloneDeep($localStorage.user);

1

С self.user & $ localStorage.user указывают на тот же объект, модификация на одном отразятся на другой, так что вам придется сделать глубокую копию, чтобы избежать этого.

 Смежные вопросы

  • Нет связанных вопросов^_^