角度无意绑定/对象镜像
问题描述:
因此,我正在使用AngularJS进行项目工作,我需要能够将范围中的对象的值与先前记录的值进行比较。我通过一个算法,如下面的一个这样做:角度无意绑定/对象镜像
function() {
var data = [
{ id: 1, key: 'value', foo: 'bar'},
{ id: 2, key: 'value', foo: 'bar'}
]
$scope.oldTarget = data[0];
$scope.target = data[0];
}
现在,如果我做的事:
function() {
$scope.target.foo = 'fighters';
if ($scope.target != $scope.oldTarget) console.log('Target was modified');
console.log($scope.target);
console.log($scope.oldTarget);
}
这将输出:
{ id: 1, key: 'value', foo: 'fighters'}
{ id: 1, key: 'value', foo: 'fighters'}
我的假设是, AngularJS自动绑定两个变量target和oldTarget,并镜像对oldTarget进行的所有更改。这是否是这种情况,如果是这样,我是否有防止这种情况?如果不是,我在做什么导致它做到这一点?
答
这是没有关系的角度,它的默认的JavaScript行为。您正在引用同一个对象。如果您打算修改它而不更改源,则需要克隆该对象。
请看:
答
我认为这不是角度,这是它是如何工作的,因为$ scope.oldTarget和$ scope.target都是链接到同一个对象。
var test = {foo : 'bar'};
var newTest = test;
newTest.foo = 'changed';
console.log(test);
个输出是: “对象{富 ”改变“}”
答
看起来你的数组元素被 “引用” 引用。因此,创建像这样的元素的新实例:
$scope.oldTarget = $.extend(null,data[0]);
$scope.target = $.extend(null,data[0]);
因此,你可以尝试使用angular.copy(数据)来防止这种情况。 – Rasalom 2014-11-25 14:16:27