所以我正在使用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。是这样的,如果是这样的话,我还有什么可以阻止这种情况吗?如果没有,我在做什么导致它这样做?
答案 0 :(得分:1)
我认为这不是有角度的,这就是它的工作原理,因为$ scope.oldTarget和$ scope.target都是指向同一对象的链接。
var test = {foo : 'bar'};
var newTest = test;
newTest.foo = 'changed';
console.log(test);
输出为:"对象{foo:"已更改"}"
答案 1 :(得分:1)
这与Angular的默认JavaScript行为无关。您正在引用同一个对象。如果您打算在不更改源的情况下修改它,则需要克隆该对象。
看看:
答案 2 :(得分:0)
看起来你的数组元素是“引用”引用的。因此,像这样创建元素的新实例:
$scope.oldTarget = $.extend(null,data[0]);
$scope.target = $.extend(null,data[0]);