Возникли проблемы с назначением области видимости переменной для манипуляции - PullRequest
1 голос
/ 20 июня 2019

Попытка назначить объект области видимости переменной JavaScript для незначительных манипуляций перед отправкой в ​​мой API. Однако любые изменения, внесенные в переменную JavaScript, изменяют объект области.

var recruitingCallListOutput = $scope.RecrutingCallingList.Recruit;

// manipulation of recruitingCallListOutput

Манипулирование фактически все еще обновляет объект области видимости, который не желателен. Чувствую, что я неправильно понимаю что-то в AngularJS. Есть ли способ получить данные и отсоединить их от объема?

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

В вашем примере recruitingCallListOutput представляет собой ссылку на $ scope.RecrutingCallingList.Recruit (см. https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0 для более подробной информации.) Вы захотите сделать копию $ scope.RecrutingCallingList.Recruit.

Если Recruit является мелким объектом, то есть не имеет вложенных объектов (значения свойств являются только примитивами), вы можете просто сделать

var recruitingCallListOutput = Object.assign({}, $scope.RecrutingCallingList.Recruit);

Если у вас есть вложенные объекты / массивы в качестве значений свойств, вам необходимо выполнить глубокое копирование. Я давно не был в мире углов, но

var recruitingCallListOutput = angular.copy($scope.RecrutingCallingList.Recruit)

вы могли бы использовать angular.copy в обоих примерах.

0 голосов
/ 20 июня 2019

Это никак не связано с AngularJS. Это Javascript, и это ожидаемое поведение.

Например, если вы откроете консоль браузера (F12-> Консоль) прямо сейчас и запустите это:

var foo = {x:1};
var copy=foo;
copy.x=2;
console.log(foo.x);

вы увидите {x:2} распечатано.

Это то же поведение, которое вы ожидали бы для любой ссылки на объект в Javascript, C #, Java и т. Д. Поскольку вы делаете ссылку , а не копию, любые изменения в ссылке фактически являются изменениями в оригинал.

Самый простой способ решить эту проблему в вашем случае - скопировать интересующие вас значения из рассматриваемого элемента в совершенно отдельный объект и изменить , который копирует.

, например

var recruitingCallListOutput = {
    name: $scope.RecrutingCallingList.Recruit.name,
    age:$scope.RecrutingCallingList.Recruit.age,
    modifiedSomething: $scope.RecrutingCallingList.Recruit.something + 42 //or whatever modifications you need to make
   ...and so on.
};

Существуют способы "клонировать" объект в Javascript , но если ваш объект действительно не очень сложный, я был бы осторожен. И подумайте, если вам действительно нужно все свойств исходного объекта в любом случае, возможно, вам нужно только отправить некоторые из них на ваш бэкэнд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...