1

我正在使用 angularJS,我是个新手。所以我在控制器范围中有一个变量,看起来像这样。

$scope.emptyContact = {'contact_firstname':'', 'contact_lastname':''};

我想用它来重置newContact我用来添加表单数据的json。但是当我这样做时:

$scope.newContact = $scope.emptyContact;

当我更改newContact变量中的某些内容时,它也会更改为emptyContact变量。有没有办法在不将它们的数据“绑定”在一起的情况下为newContact变量提供值?emptyContact谢谢你,丹尼尔!

4

4 回答 4

1

是的。发生这种情况是因为对对象的引用是保留的

a = {};     // a will be an empty object
b = a;      // b will be a (the reference is kept)
a === b     // return true
b.c = 12;   // set c key to b
a.c         // returns 12 because b is a and c is set to a, too

d = JSON.parse(JSON.stringify(a)); // clone a 
a === d                            // return false because d is not a
d.e = 13;                          // sets e key as 13
a.e                                // returns undefined because d is NOT a

所以,我总是更喜欢用来obj1 = JSON.parse(JSON.stringify(obj1))克隆一个对象。

您的代码变为:

$scope.newContact = JSON.parse(JSON.stringify($scope.emptyContact));

或使用angular.copy()

angular.copy($scope.emptyContact, $scope.newContact);

...你的emptyContact意志不会改变。

于 2013-10-06T10:54:22.097 回答
1
$scope.emptyContact = function(){
    this.contact_firstname ='';
    this.contact_lastname = ''
};
$scope.newContact = new $scope.emptyContact();

这样您就可以从 emptyContact 创建新对象。

于 2013-10-06T11:00:31.470 回答
1

改变:

$scope.newContact = $scope.emptyContact;

至:

angular.copy($scope.emptyContact, $scope.newContact);

见:http ://docs.angularjs.org/api/angular.copy

解释如下:

在 Javascript 中,当您将一个对象分配给另一个对象时,您实际上是在传递一个引用,因此两个变量实际上都在引用同一个对象。

这是来自 NodeJS repl 的示例:

> a = {'msg': 'hello'}
{ msg: 'hello' }
> b = a
{ msg: 'hello' }
> b.count = 50
50
> a
{ msg: 'hello', count: 50 }
> 

在上面的示例中,引用 froma被复制到b, 到两者ab然后指向相同的value

如果您希望能够在b不影响的情况下进行更改a,则需要克隆a不是仅复制引用。这是一种方法:

b = JSON.parse(JSON.stringify(a))

以 Node repl 中的示例为例:

> a = {'msg': 'bye'}
{ msg: 'bye' }
> b = JSON.parse(JSON.stringify(a))
{ msg: 'bye' }
> b
{ msg: 'bye' }
> b.count = 55
55
> a
{ msg: 'bye' }
> b
{ msg: 'bye', count: 55 }
> 

AngularJS实际上有自己的实现,请参阅http://docs.angularjs.org/api/angular.copy,这是您在使用 AngularJS 时应该实际使用的。

于 2013-10-06T10:49:55.163 回答
0

克隆对象将帮助您实现这一目标

请查看以下链接

在 JavaScript 中深度克隆对象的最有效方法是什么?

于 2013-10-06T10:49:14.237 回答