angular.copy有什么好处?

3

我在某些情况下使用angular.copy,例如将模型默认值复制到表单模型中,如下所示:

var customerModel = {
  name: '',
  point: 0
};

$scope.customer = angular.copy(customerModel);

function save() {
  //... Reset $scope.customer after success submit
  $scope.customer = angular.copy(customerModel);
}

如何避免默认客户模型的更改?

但是为什么要复制空对象或者数组?{} 或 []

我发现在一些代码中使用了 angular.copy 来复制空对象或者数组。为什么他们不直接将空对象赋值给变量呢?

$scope.customer = {}; // or [] for array

如果您在空对象或数组上使用复制,能否解释一下其好处?

那么ajax响应($http)呢?

还有一个问题,您对ajax响应采取了什么操作?是直接复制还是直接分配给变量?

$http
  .get('example.com/api/v1/get/customer/1')
  .success(function(response) {
    $scope.customer = angular.copy(response.data);
    // or do you use $scope.customer = response.data ?
  })
;

如果您使用了复制功能,那么您认为响应对象会发生什么情况? 它是否仍留在内存中?还是会自动删除?


也许这个可以帮助到你 angular.copy - Hacketo
对于内存问题,由于你在复制response.data而不是response,所以你不知道何时GC会释放response,因为它可能被其他地方使用。 - Hacketo
@cespon 不确定为什么需要这个评论。简而言之,它使您可以访问深度对象复制,而无需另一个库。Angular在内部使用副本,这就是为什么它存在的原因。 - Dan
@Kiddo:这是两个非常不同的问题:让东西工作和让它快速。关于GC的担忧是怎么回事?我敢打赌,这对你来说并不是真正的问题。只是你从互联网上学到的东西。先让你的管理员工作,然后再进行内存分析。 - Sergio Tulentsev
1
你应该找到问题的根源,而不是盲目地对其进行优化。你确定你的文件已经被压缩了吗?那个文件尺寸非常大。我猜测这包括了 Angular 和 UI router 的压缩。如果你的问题是文件大小,GC 并不能帮助你。优化 GC 可能是你最后需要做的事情之一,因为它很难帮助你(因为 GC 是不确定性的)。 - Dan
显示剩余4条评论
2个回答

4

您可以复制一个对象来防止其他代码对其进行修改(原始对象可能会发生更改,但是您的副本不会看到这些更改)。

如果您执行以下操作:

 $scope.customer = customerModel

当回调/服务/其他组件更改 customerModel 时,您的作用域会反映此更改。但这并不总是理想的,因此需要进行深拷贝。
复制空字面对象:
$scope.customer = angular.copy({})
// or
$scope.customer = {}

这没有任何区别。每次都是一个新的空对象。请注意,这与以下内容非常不同:
this.customerModel = {};
$scope.customer = angular.copy(this.customerModel)

复制ajax响应数据

同样的规则适用。如果你想确保这个对象不会在你下面改变(例如,如果你也把它传给了别处),你应该复制它。


复制一个对象并不会防止修改原始对象。 - Hacketo
当然。它可以防止您的副本看到更改。 - Sergio Tulentsev
空对象或数组的复制怎么办?{} 和 []。 - Kiddo
那么关于Ajax响应,你更喜欢哪种方式?是复制还是直接存储到变量中? - Kiddo
2
是的,这不会有任何影响。 - Dan
显示剩余5条评论

3

angular.copy创建变量的深层副本,以便它将持有另一个变量的引用。

有时候用户不想使用按引用调用时会使用深拷贝。根据您的问题来看,这可能是需要的。

var customerModel = {
  name: '',
  point: 0
};

如果您使用$scope.customer = angular.copy(customerModel);,它将创建customerModel的深层副本。
就$http服务而言,数据来自响应。如果您直接分配数据,则调用引用不会产生任何影响,因为数据来自另一个源。因此,在$http.get()方面,我更倾向于直接分配它。

我编辑了问题以使其更清晰。希望您不介意再次查看。谢谢。 - Kiddo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接