2014-02-13 60 views
1

我们尝试过angular.copyangular.extend。但是,这两个都复制属性值。我们如何将一个对象的属性(不带它们的值)复制到另一个对象?使用Angular将对象属性(不含值)复制到另一个对象

这是fiddle,我们的尝试基于how-to-quickly-clear-a-javascript-object

angular.module('App', []); 

function Ctrl($scope) { 

    function copyNotValues(obj) { 
     var newObj = angular.copy(obj); 
     for (prop in newObj) { 
      if(newObj.hasOwnProperty(prop)) 
      { 
       newObj[prop] = null; 
      } 
     }; 
     return newObj; 
    } 

    $scope.master = { 
     foo: 'original foo', 
     bar: 'original bar' 
    }; 

    $scope.copy = angular.copy($scope.master); 
    $scope.extend = angular.extend($scope.master); 
    $scope.copyNotValues = copyNotValues($scope.master); 

} 

回答

1

JavaScript没有类的概念。它使用Prototype继承,这意味着您只能通过复制另一个对象来创建新对象。当你这样做时,你会得到属性。

你可以通过创建一个没有属性值的“主”对象来解决这个问题。事情是这样的:

master = { 
    foo: '', 
    bar: '' 
}; 

然后你就可以创建新的对象“实例”使用new关键字:

$scope.master = new master(); 
$scope.master.foo = 'original foo'; 
$scope.master.bar = 'original bar'; 

当你需要创建对象的新实例,回去原来,不是你的副本:

$scope.masterCopy = new master(); 

这的确是一个JavaScript的问题,而不是一个角具体问题。我想你理论上可以编写一个函数来创建一个对象的新实例,然后遍历这些属性将它们全部设置为空或空字符串。

+1

感谢您的!我的方法是使用angular.copy(),遍历新对象,并将其每个属性设置为null。创建一个“主”对象可能对另一种情况有好处,因为我的兴趣对象来自REST调用并具有许多属性,所以创建主对象会导致大量代码重复。 –

+1

@ShaunLuttin在我的ActionScript体验中,在服务器端和客户端复制对象是非常有意义的。但是由于JavaScript是一种松散类型的语言,因此开销可能没有意义。我很确定每个循环都会给你一个对象的所有属性;你应该能够将其封装到一个实用函数中,以便于重用。祝你好运! – JeffryHouser

+1

伟大的提示!我们已经复制了服务器端和客户端上的对象。在服务器上,我们有一个绑定模型和一个视图模型。在客户端,我们有HTML模板中存在的ng模型。如果我们也要在ng控制器中复制模型,那么我们将有相同模型的四个表示形式!就像你提到的,三个似乎有足够的开销。 JavaScript for循环在我们投入到Angular服务中的效用函数中做了诀窍。谢谢你的鼓励! –

0

我的解决方案如下 您可以使用angular.copy并传递对象。在此之前用空白大括号定义对象。代码如下。我使用了其他一些示例,但下划线方法相同。

angular.module('formExample', []) 
 
    .controller('ExampleController', ['$scope', function($scope) { 
 

 
    $scope.sa = {}; //declaring sa object 
 
    $scope.ba = {}; //declaring ba object 
 
    $scope.update = function() { 
 
     $scope.ba = angular.copy($scope.sa); 
 
    }; 
 

 
    }]);
<!doctype html> 
 
<html lang="en"> 
 

 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Example - example-example32-production</title> 
 

 

 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-beta.2/angular.min.js"></script> 
 

 

 

 
</head> 
 

 
<body ng-app="formExample"> 
 
    <div ng-controller="ExampleController"> 
 
    <form novalidate class="simple-form"> 
 
     <h3>Shipping Address</h3> 
 
     Name:<input type="text" ng-model="sa.name" ng-change="sameAddress && update()" placeholder="in" /><br/> Age: 
 
     <input type="text" ng-model="sa.age" ng-change="sameAddress && update()" placeholder="age" /> 
 
     <br /> Street: 
 

 
     <br /> 
 

 
     <h3>Billing Address 
 
     <input type="checkbox" ng-model="sameAddress" ng-change="sameAddress && update()" />Copy 
 
     </h3> 
 

 
     Name:<input type="text" ng-model="ba.name" ng-disabled="sameAddress" placeholder="out" /><br/> Age: 
 
     <input type="text" ng-model="ba.age" ng-disabled="sameAddress" placeholder="age" /> 
 
     <br /> 
 

 
     <br /> 
 

 
    </form> 
 

 
    </div> 
 

 

 
</body> 
 

 
</html>

的pluner是here

相关问题