Javascript copy()不是';t创建对象的独立副本

Javascript copy()不是';t创建对象的独立副本,javascript,angularjs,object,Javascript,Angularjs,Object,我有一个AngularJS应用程序,它使用工厂将JSON数据加载到对象中。请注意,下面的示例是一个非常精简的真实应用程序版本。用户对象使用getter/setter方法访问其属性,因为现实生活中的应用程序必须处理比简单属性分配更多的逻辑。这意味着我不能简单地绑定到视图上的ngModel——我必须使用自定义指令。当我想对对象进行编辑时,我会在控制器中创建对象的副本,让用户在视图中对其进行更改,最后在控制器中保存或取消这些更改。但是,当我调用angular.copy()时,这两个对象似乎仍然是链接的

我有一个AngularJS应用程序,它使用工厂将JSON数据加载到对象中。请注意,下面的示例是一个非常精简的真实应用程序版本。用户对象使用getter/setter方法访问其属性,因为现实生活中的应用程序必须处理比简单属性分配更多的逻辑。这意味着我不能简单地绑定到视图上的ngModel——我必须使用自定义指令。当我想对对象进行编辑时,我会在控制器中创建对象的副本,让用户在视图中对其进行更改,最后在控制器中保存或取消这些更改。但是,当我调用
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;