2014-11-25 80 views
2

因此,我正在使用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進行的所有更改。這是否是這種情況,如果是這樣,我是否有防止這種情況?如果不是,我在做什麼導致它做到這一點?

回答

1

我認爲這不是角度,這是它是如何工作的,因爲$ 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

0

看起來你的數組元素被 「引用」 引用。因此,創建像這樣的元素的新實例:

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