Я сохранял все данные, полученные от служб, напрямую в локальную переменную, контроллер или область. То, что я думаю, будет считаться мелкой копией, это правильно?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Недавно мне сказали использовать angular.copy для создания глубокой копии.
$scope.example = angular.copy(response.data);
Однако информация о глубоком копировании, похоже, работает точно так же, когда используется моим приложением Angular. Есть ли конкретные преимущества использования глубокой копии (angular.copy) и не могли бы вы объяснить их мне?
javascript
angularjs
deep-copy
shallow-copy
Superman2971
источник
источник
Ответы:
Используйте angular.copy при назначении значения объекта или массива другой переменной, и это
object
значение не должно изменяться.Без глубокого копирования или использования angular.copy , изменения значения свойства или добавления любого нового свойства обновляют все объекты, ссылающиеся на этот же объект.
источник
$scope.one = response.data
и установить$scope.two = response.data
. Тогда делай$scope.two.addProperty = something
. Я, наверное, должен просто проверить это :), но хотел бы получить понимание сообщества.object property
обновления нового значения для всех объектов, имеющих одинаковую ссылку. Вот почему вы должны использовать angular.copyВ этом случае вам не нужно использовать
angular.copy()
Пояснение :
=
представляет ссылку, тогда какangular.copy()
создает новый объект в виде глубокой копии.Использование
=
будет означать, что изменение свойстваresponse.data
изменит соответствующее свойство$scope.example
или наоборот.Использование
angular.copy()
двух объектов останется отдельным, а изменения не будут отражаться друг на друге.источник
Я бы сказал, что
angular.copy(source);
в вашей ситуации нет необходимости, если позже вы не используете это без пункта назначенияangular.copy(source, [destination]);
.https://docs.angularjs.org/api/ng/function/angular.copy
источник
angular.copy()
объект, чтобы предотвратить изменение кода другим кодом. Исходный объект может измениться, но ваша копия не увидит изменений. Вы можете восстановить копию при необходимости.При использовании angular.copy вместо обновления ссылки создается новый объект, который назначается пункту назначения (если указан пункт назначения). Но это еще не все. Есть такая классная вещь, которая случается после глубокого копирования.
Скажем, у вас есть фабричный сервис, у которого есть методы, которые обновляют фабричные переменные.
и контроллер, который использует эту услугу,
Когда вышеуказанная программа будет запущена, результат будет следующим:
Таким образом, отличная особенность использования углового копирования состоит в том, что ссылки на место назначения отражаются при изменении значений, без необходимости повторного присвоения значений вручную.
источник
Я знаю, что это уже ответили, все же я просто пытаюсь сделать это простым. Таким образом, angular.copy (data) вы можете использовать в случае, если вы хотите изменить / изменить полученный объект, оставив его исходные значения неизмененными / неизменными.
Например: предположим, что я сделал вызов API и получил свой originalObj, теперь я хочу изменить значения api originalObj для некоторых случаев, но я хочу, чтобы исходные значения тоже были, поэтому я могу сделать копию моего api originalObj. в duplicateObj и измените duplicateObj таким образом, мои значения originalObj не изменятся. Проще говоря, модификация duplicateObj не будет отражаться в originalObj в отличие от поведения js obj.
Результат как ....
источник
Я просто делюсь своим опытом здесь, я использовал angular.copy () для сравнения двух свойств объектов. Я работал над несколькими входами без элемента формы, мне было интересно, как сравнить два свойства объекта, и на основании результата я должен включить и отключить кнопку сохранения. Так что я использовал, как показано ниже.
Я присвоил исходные пользовательские значения объекта сервера своему фиктивному объекту, чтобы сказать userCopy, и использовал watch, чтобы проверить изменения в пользовательском объекте.
Мой серверный API, который получает данные от сервера:
Я не уверен, но сравнение двух объектов всегда было для меня головной болью, но с angular.copy () все прошло гладко.
источник
Javascript передает переменные
by reference
, это означает, что:Теперь, потому что
by reference
частьi
- это [1], а такжеj
[1], хотя только онаi
была изменена. Это потому, что когда мы говорим, чтоj = i
javascript не копируетi
переменную и не присваивает ее,j
а ссылается наi
переменную черезj
.Угловая копия позволяет нам потерять эту ссылку, что означает:
Теперь
i
здесь равен [1], а по-j
прежнему равен [].Бывают ситуации, когда такая
copy
функциональность очень удобна.источник
angular.copy
является более интеллектуальным, чем сериализация JSON, потому что она может иметь дело с функциями.