Javascript 角度非故意绑定/对象镜像
因此,我正在使用AngularJS进行一个项目,在这个项目中,我需要能够将作用域中的对象的值与其以前记录的值进行比较。我是通过一个算法来实现的,比如下面的算法:Javascript 角度非故意绑定/对象镜像,javascript,angularjs,variables,Javascript,Angularjs,Variables,因此,我正在使用AngularJS进行一个项目,在这个项目中,我需要能够将作用域中的对象的值与其以前记录的值进行比较。我是通过一个算法来实现的,比如下面的算法: function() { var data = [ { id: 1, key: 'value', foo: 'bar'}, { id: 2, key: 'value', foo: 'bar'} ] $scope.oldTarget = data[0]; $scope.tar
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,并将对target所做的任何更改镜像到oldTarget。是这样吗?如果是这样的话,我有没有办法阻止这种情况?如果不是,我在做什么导致它这样做?我假设这不是角度,这就是它的工作原理,因为$scope.oldTarget和$scope.target都是指向同一个对象的链接
var test = {foo : 'bar'};
var newTest = test;
newTest.foo = 'changed';
console.log(test);
输出为:“对象{foo:“已更改”}”
这与Angular无关,它是默认的JavaScript行为。您正在引用同一对象。如果要在不更改源的情况下对其进行修改,则需要克隆对象 看一看:
$scope.oldTarget = $.extend(null,data[0]);
$scope.target = $.extend(null,data[0]);
因此,您可以尝试使用angular.copy(数据)来防止这种情况。