Javascript copy()不是';t创建对象的独立副本
我有一个AngularJS应用程序,它使用工厂将JSON数据加载到对象中。请注意,下面的示例是一个非常精简的真实应用程序版本。用户对象使用getter/setter方法访问其属性,因为现实生活中的应用程序必须处理比简单属性分配更多的逻辑。这意味着我不能简单地绑定到视图上的ngModel——我必须使用自定义指令。当我想对对象进行编辑时,我会在控制器中创建对象的副本,让用户在视图中对其进行更改,最后在控制器中保存或取消这些更改。但是,当我调用Javascript copy()不是';t创建对象的独立副本,javascript,angularjs,object,Javascript,Angularjs,Object,我有一个AngularJS应用程序,它使用工厂将JSON数据加载到对象中。请注意,下面的示例是一个非常精简的真实应用程序版本。用户对象使用getter/setter方法访问其属性,因为现实生活中的应用程序必须处理比简单属性分配更多的逻辑。这意味着我不能简单地绑定到视图上的ngModel——我必须使用自定义指令。当我想对对象进行编辑时,我会在控制器中创建对象的副本,让用户在视图中对其进行更改,最后在控制器中保存或取消这些更改。但是,当我调用angular.copy()时,这两个对象似乎仍然是链接的
angular.copy()
时,这两个对象似乎仍然是链接的,因为更改其中一个对象中的数据也会更改另一个对象中的数据。为什么会这样
这是我的JSFIDLE:
以下是我的看法:
<div ng-app="foo" ng-controller="ctrl">
<div ng-repeat="(userID, user) in users">
<span ng-if="inEditMode(userID)">
<input type="text"
ng-model="$name"
ng-model-getter="editUsers[userID].getName()"
ng-model-setter="editUsers[userID].setName($value)" />
<button ng-click="saveChanges(userID)">Save</button>
<button ng-click="setEditMode(editUsers[userID].getID(), false)">Cancel</button>
</span>
<span ng-if="!inEditMode(userID)">
{{user.getName()}}
<button ng-click="setEditMode(userID, true)">Edit</button>
</span>
</div>
</div>
有趣的部分是理论上的
。
行(我的JSFIDLE中的第30行)。这不是创建独立对象。查看angular.copy的源,如果未指定目标,则将其设置为源
if (!destination) {
destination = source;
最后,它只是:
return destination;
name
和id
属性在User
工厂中被错误地绑定为私有属性,因此无法在视图中访问name
(我假设它破坏了双向绑定)
将它们绑定到factory对象(使用this
)并应解决该问题
角度模块('foo',[])
.controller('ctrl',函数($scope,UserFactory)
{
//将用户ID映射到用户对象
//使用散列而不是数组进行ID快速访问
$scope.users=UserFactory.load();
//将用户ID映射到相应用户对象的副本,用于编辑
$scope.editUsers={};
//返回我们是否正在编辑用户
$scope.inEditMode=函数(userID)
{
返回$scope.editUsers.hasOwnProperty(userID);
};
//复制对实际用户对象所做的更改
$scope.saveChanges=函数(userID)
{
$scope.users[userID]=angular.copy($scope.editUsers[userID]);
//不需要编辑副本,所以请扔掉它
删除$scope.editUsers[userID];
};
//打开/关闭编辑模式
$scope.setEditMode=函数(userID,ineeditmode)
{
如果(InEdit模式)
{
//理论上,这应该创建同一对象的两个独立副本
$scope.editUsers[userID]=angular.copy($scope.users[userID]);
/**
*证明这些是相同的对象:
*这不应影响视图中的编辑副本,但确实会影响
*/
$scope.users[userID].setName(“为什么相同”);
}
其他的
{
//我们正在有效地取消我们所做的更改
删除$scope.editUsers[userID];
}
};
})
.factory('UserFactory',函数(用户)
{
返回{
加载:函数()
{
//使用用户数据模拟JSON响应
var rawUserData=[
{id:1,名字:“Dave”},
{id:2,名字:“Brian”}
];
var userIDsToObjects={};
for(var userIter=0;userIter
拯救
取消
{{user.getName()}}
编辑
能否尝试angular.copy($scope.users[userID],$scope.editUsers[userID]);类型语法?文档并不完全清楚,但听起来好像如果目的地没有传入,那么它也不会返回。为什么需要ng model getter
/ return destination;