我创建了一个简单的jsfiddle来说明我的问题:
HTML:
<div ng-controller="MyCtrl">
<div ng-repeat="p in products">
<span ng-click="overwrite(p)">{{ p.id }}: {{ p.name }}</span>
</div>
</div>
使用Javascript:
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
var products = [{id:1, name:'first'}, {id:2, name:'second'}];
$scope.products = products;
var prod = {id: 3, name:'third'};
$scope.overwrite = function(p){
p.id = 4;
p.name = 'forth';
p = prod; // this doesn't work nor does angular.copy(prod)
}
}
如您所见,当我手动设置属性时,值是bind。但是当我覆盖一个对象时,没有任何反应。这怎么可能?当我想要恢复其原始状态的对象时,我该怎么办?
想象一下,我使用var productBackup = angular.copy(product)
创建备份对象。然后我对原始产品进行了更改,之后我决定取消更改。我想使用product = productBackup
执行此操作。但这不起作用!在这种情况下,我是否需要手动设置所有属性?
product.id = productBackup.id;
product.name = productBackup.name;
etc...
答案 0 :(得分:23)
如果你使用angular.copy(source, destination)
,你就可以达到所希望的效果。
<强> updated fiddle 强>
正在发生的事情是,即使您完成作业,角度仍在观看原始p
参考。如果您使用angular.copy()
,则会将值从prod
复制到p
,而角度正在正确观看。
我问了similar question,但它在共享服务中处理了这个问题。
答案 1 :(得分:3)
我以前从未使用过AngularJS,但我认为这里发生的是你的参数p
不是你的简单键/值对象,而是更复杂的AngularJS对象。通过将prod
分配给它,您将覆盖它,而不是更改对象的特定部分。
以下代码段可能会帮助您:
for(var key in prod) {
p[key] = prod[key];
}