角度无意绑定/对象镜像

角度无意绑定/对象镜像

问题描述:

因此,我正在使用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); 

个输出是: “对象{富 ”改变“}”

http://jsfiddle.net/rf0ac6zf/

+0

因此,你可以尝试使用angular.copy(数据)来防止这种情况。 – Rasalom 2014-11-25 14:16:27

看起来你的数组元素被 “引用” 引用。因此,创建像这样的元素的新实例:

$scope.oldTarget = $.extend(null,data[0]); 
$scope.target = $.extend(null,data[0]);