AngularJS 是交叉绑定变量?
AngularJS is cross-binding variables?
我通过使用 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 以供参考?
当你对对象使用赋值时,你只是给变量一个对象的引用,而不是复制对象。在您的代码中,$scope.data1
、$scope.data1Ref
和 res1
都指向完全相同的对象实例。要创建新对象,您需要复制现有对象。
Angular提供了两个函数可以复制一个对象,一个创建浅拷贝,一个创建深拷贝。浅拷贝复制原始字段,如果对象包含子对象,则原始对象和副本都指向同一个子对象实例。在深拷贝中,任何子对象也会创建新的副本。
angular.extend
可用于创建浅拷贝,而angular.copy
可用于深拷贝。
这是因为在JavaScript中,对象是通过引用传递的。当您将 $scope.data1 和 $scope.data1Ref 设置为等于 res1 时,您将它们设置为等于 reference to res1.
要解决这个问题,您可以使用 angular.copy.
对 res 对象进行深度复制
$scope.res1Ref = angular.copy(res1);
在AngularJS中,复杂对象通过引用传递。您可以在此处找到更多信息:
我通过使用 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 以供参考?
当你对对象使用赋值时,你只是给变量一个对象的引用,而不是复制对象。在您的代码中,$scope.data1
、$scope.data1Ref
和 res1
都指向完全相同的对象实例。要创建新对象,您需要复制现有对象。
Angular提供了两个函数可以复制一个对象,一个创建浅拷贝,一个创建深拷贝。浅拷贝复制原始字段,如果对象包含子对象,则原始对象和副本都指向同一个子对象实例。在深拷贝中,任何子对象也会创建新的副本。
angular.extend
可用于创建浅拷贝,而angular.copy
可用于深拷贝。
这是因为在JavaScript中,对象是通过引用传递的。当您将 $scope.data1 和 $scope.data1Ref 设置为等于 res1 时,您将它们设置为等于 reference to res1.
要解决这个问题,您可以使用 angular.copy.
对 res 对象进行深度复制$scope.res1Ref = angular.copy(res1);
在AngularJS中,复杂对象通过引用传递。您可以在此处找到更多信息: