为什么以及何时使用angular.copy? (深度复制)
我一直将从服务接收的所有数据直接保存到本地变量,控制器或范围。 我认为会被认为是浅拷贝,对吗?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
最近我被告知要使用angular.copy来创建一个深层副本。
$scope.example = angular.copy(response.data);
但是,当我的Angular应用程序使用深层复制信息时,它似乎以相同的方式工作。 使用深层拷贝(angular.copy)有什么特别的好处,你能向我解释一下吗?
在将对象或数组的值分配给另一个变量时使用angular.copy,并且不应更改该object
值。
如果没有深拷贝或使用angular.copy ,更改属性值或添加任何新属性会更新引用同一对象的所有对象。
var app = angular.module('copyExample', []);
app.controller('ExampleController', ['$scope',
function($scope) {
$scope.printToConsole = function() {
$scope.main = {
first: 'first',
second: 'second'
};
$scope.child = angular.copy($scope.main);
console.log('Main object :');
console.log($scope.main);
console.log('Child object with angular.copy :');
console.log($scope.child);
$scope.child.first = 'last';
console.log('New Child object :')
console.log($scope.child);
console.log('Main object after child change and using angular.copy :');
console.log($scope.main);
console.log('Assing main object without copy and updating child');
$scope.child = $scope.main;
$scope.child.first = 'last';
console.log('Main object after update:');
console.log($scope.main);
console.log('Child object after update:');
console.log($scope.child);
}
}
]);
// Basic object assigning example
var main = {
first: 'first',
second: 'second'
};
var one = main; // same as main
var two = main; // same as main
console.log('main :' + JSON.stringify(main)); // All object are same
console.log('one :' + JSON.stringify(one)); // All object are same
console.log('two :' + JSON.stringify(two)); // All object are same
two = {
three: 'three'
}; // two changed but one and main remains same
console.log('main :' + JSON.stringify(main)); // one and main are same
console.log('one :' + JSON.stringify(one)); // one and main are same
console.log('two :' + JSON.stringify(two)); // two is changed
two = main; // same as main
two.first = 'last'; // change value of object's property so changed value of all object property
console.log('main :' + JSON.stringify(main)); // All object are same with new value
console.log('one :' + JSON.stringify(one)); // All object are same with new value
console.log('two :' + JSON.stringify(two)); // All object are same with new value
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="copyExample" ng-controller="ExampleController">
<button ng-click='printToConsole()'>Explain</button>
</div>
在这种情况下,你不需要使用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
链接地址: http://www.djcxy.com/p/40709.html