角度无意的绑定/对象镜像

时间:2014-11-25 14:08:08

标签: javascript angularjs variables

所以我正在使用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。是这样的,如果是这样的话,我还有什么可以阻止这种情况吗?如果没有,我在做什么导致它这样做?

3 个答案:

答案 0 :(得分:1)

我认为这不是有角度的,这就是它的工作原理,因为$ scope.oldTarget和$ scope.target都是指向同一对象的链接。

var test = {foo : 'bar'};
var newTest = test;
newTest.foo = 'changed';
console.log(test);

输出为:"对象{foo:"已更改"}"

http://jsfiddle.net/rf0ac6zf/

答案 1 :(得分:1)

这与Angular的默认JavaScript行为无关。您正在引用同一个对象。如果您打算在不更改源的情况下修改它,则需要克隆该对象。

看看:

答案 2 :(得分:0)

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

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