AngularJS是交叉绑定变量吗?

时间:2016-03-01 17:34:23

标签: javascript angularjs angularjs-scope angularjs-bindings

我通过使用Promises下载JSON数据并将其存储在变量中来开始我的Angular控制器:

app.controller('mainController', ['$scope', '$http', '$q', function($scope, $http, $q) {
  var req1 = $http({method: 'GET', url: 'link to JSON 1', cache: 'true'});
  var req2 = $http({method: 'GET', url: 'link to JSON 2', cache: 'true'});

  $q.all([req1, req2]).then(function(response){
    var res1 = response[0].data;
    var res2 = response[1].data;

    $scope.data1 = res1;       // JSON which I will manipulate
    $scope.data1Ref = res1;   // JSON for reference which I won't manipulate

    $scope.data2 = res2;
    $scope.data2Ref = res2;

    init(); // do the stuff with the data
  });
}]);

完成init()后,如果我检查$scope.data1$scope.data1Ref它们都已被修改,那就是它们被绑定在一起。

为什么会发生这种情况?如何确保保存原始下载的JSON的存储版本以供参考?

3 个答案:

答案 0 :(得分:0)

当您使用对象赋值时,您只给变量一个对象的引用,而不是复制对象。在您的代码中,$scope.data1$scope.data1Refres1都指向完全相同的对象实例。要创建新对象,您需要复制现有对象。

Angular提供了两个可以复制对象的函数,一个创建浅拷贝,另一个创建深拷贝。浅拷贝复制原始字段,如果对象包含子对象,则原始副本和副本都指向同一子对象实例。在深层副本中,任何子对象也都会创建新副本。

angular.extend可用于创建浅色副本,而angular.copy可执行深层复制。

答案 1 :(得分:0)

这是因为在JavaScript中,对象是通过引用传递的。当您将$ scope.data1和$ scope.data1Ref设置为等于res1时,您将它们设置为等于引用到res1。

要解决此问题,您可以使用angular.copy制作res对象的深层副本。

$scope.res1Ref = angular.copy(res1);

答案 2 :(得分:0)

在AngularJS中,复杂对象通过引用传递。您可以在此处找到更多信息:Difference between angular.copy() and assignment (=)