Javascript 制作$scope持有的数据的副本

Javascript 制作$scope持有的数据的副本,javascript,angularjs,Javascript,Angularjs,假设我在$scope中有几个变量,我想创建一个包含这些变量的新对象,而不包含$scope中包含的所有内部内容。我不一定知道要复制的$scope变量的名称 比如: $scope.a = "Test"; $scope.b = {x: 1, y: 2}; $scope.c = 99; //possibly other unknown variables var obj = angular.copy_without_angular_stuff($scope); 我怎样才能得到相关的数据 可能的解决方

假设我在
$scope
中有几个变量,我想创建一个包含这些变量的新对象,而不包含
$scope
中包含的所有内部内容。我不一定知道要复制的
$scope
变量的名称

比如:

$scope.a = "Test";
$scope.b = {x: 1, y: 2};
$scope.c = 99;
//possibly other unknown variables

var obj = angular.copy_without_angular_stuff($scope);

我怎样才能得到相关的数据

可能的解决方案是将一个对象的属性(在本例中为$scope)复制到另一个对象中:

for(var k in $scope) {
  secondObject[k] = $scope[k];
}

一种可能的解决方案是将一个对象(在本例中为$scope)的属性复制到另一个对象中:

for(var k in $scope) {
  secondObject[k] = $scope[k];
}
你可以用

this
而不是

$scope

控制器:

angular.module('myApp').controller('MyCtrl', function(){
  var vm = this;

  vm.a = 'test';

  vm.b = {a: 'a', b: 'b'};

  vm.c = 123;

  var obj = vm;

});
angular.module('myApp').controller('My2ndCtrl', function($scope) {
  $scope.a = 'test';

  $scope.b = {a: 'a', b: 'b'};

  $scope.c = 123;

  var obj = {};


  for(var k in $scope) {
    if($scope.hasOwnProperty(k) && k.indexOf('$') < 0) {
      obj[k] = $scope[k]
    }
  }
 console.log(obj);
});
在我的视图中,我显示了附加到VM的每个值。以及VM,其中仅显示a、b和c作为附加到VM的对象

vm.a: {{vm.a}}
<br/>
vm.b: {{vm.b}}
<br/>
vm.c: {{vm.c}}
<br/>

vm: {{vm}}
你可以用

this
而不是

$scope

控制器:

angular.module('myApp').controller('MyCtrl', function(){
  var vm = this;

  vm.a = 'test';

  vm.b = {a: 'a', b: 'b'};

  vm.c = 123;

  var obj = vm;

});
angular.module('myApp').controller('My2ndCtrl', function($scope) {
  $scope.a = 'test';

  $scope.b = {a: 'a', b: 'b'};

  $scope.c = 123;

  var obj = {};


  for(var k in $scope) {
    if($scope.hasOwnProperty(k) && k.indexOf('$') < 0) {
      obj[k] = $scope[k]
    }
  }
 console.log(obj);
});
在我的视图中,我显示了附加到VM的每个值。以及VM,其中仅显示a、b和c作为附加到VM的对象

vm.a: {{vm.a}}
<br/>
vm.b: {{vm.b}}
<br/>
vm.c: {{vm.c}}
<br/>

vm: {{vm}}

如果您对使用下划线感到满意,您可以这样做

var obj = _.extendOwn({}, $scope);
否则,只需在循环中手动复制属性

var obj = {};

for(var k in $scope) {
    if(Object.prototype.hasOwnProperty.call($scope, k)) {
        obj[k] = $scope[k];   
    }
}

如果您对使用下划线感到满意,您可以这样做

var obj = _.extendOwn({}, $scope);
否则,只需在循环中手动复制属性

var obj = {};

for(var k in $scope) {
    if(Object.prototype.hasOwnProperty.call($scope, k)) {
        obj[k] = $scope[k];   
    }
}

$scope
对象有几个从
$
开始的间隔属性,因此作为解决方法,您可以只复制不从
$
开始的属性,甚至为内部
$scope
属性创建映射,如果属性不在映射中,则复制它。
注意:不同角度版本的内部属性列表可能不同

angular.module('app',[])
.控制器('ctrl1',功能($scope){
功能clearCopy(范围){
var dest={};
对于(范围内的var i){
if(scope.hasOwnProperty(i)和&i[0]!='$'和&i!=='this'){
dest[i]=范围[i];
}
}
返回目的地;
}
$scope.a=“测试”;
$scope.b={
x:1,
y:2
};
$scope.c=99;
$scope.copy1=clearCopy($scope);
})
.controller('ctrl2',函数($scope){
功能clearCopy(范围){
var InternalPropertiesMap={
$$ChildScope:true,
$$childHead:对,
$$childTail:是的,
$$listenerCount:true,
$$侦听器:对,
$$nextSibling:对,
$$Previsibling:对,
$$观察者:没错,
$$watchersCount:正确,
$id:是的,
$parent:对
},
dest={};
对于(范围内的var i){
if(scope.hasOwnProperty(i)和&!internalpropertiesmap[i]){
dest[i]=范围[i];
}
}
返回目的地;
}
$scope.a=“测试”;
$scope.b={
x:1,
y:2
};
$scope.c=99;
$scope.copy2=clearCopy($scope);
}).控制器('ctrl3',功能($scope){
功能clearCopy(范围){
var InternalPropertiesMap={
$$ChildScope:true,
$$childHead:对,
$$childTail:是的,
$$listenerCount:true,
$$侦听器:对,
$$nextSibling:对,
$$Previsibling:对,
$$观察者:没错,
$$watchersCount:正确,
$id:是的,
$parent:对
};
返回对象。键(范围)。减少(功能(acc,el){
if(el[0]!='$'&&typeof作用域[el]!==“函数”){
acc[el]=范围[el];
}
返回acc;
}, {});
}
$scope.a=“测试”;
$scope.b={
x:1,
y:2
};
$scope.c=99;
$scope.fun=函数(d){返回d;};
$scope.copy3=clearCopy($scope);
log($scope.copy3);
});

副本1:{{copy1}}
副本2:{{copy2}}
副本3:{{copy3}}

$scope
对象有一些从
$
开始的间隔属性,因此作为解决方法,您可以只复制不从
$
开始的属性,甚至为内部
$scope
属性创建映射,如果属性不在映射中,则复制它。
注意:不同角度版本的内部属性列表可能不同

angular.module('app',[])
.控制器('ctrl1',功能($scope){
功能clearCopy(范围){
var dest={};
对于(范围内的var i){
if(scope.hasOwnProperty(i)和&i[0]!='$'和&i!=='this'){
dest[i]=范围[i];
}
}
返回目的地;
}
$scope.a=“测试”;
$scope.b={
x:1,
y:2
};
$scope.c=99;
$scope.copy1=clearCopy($scope);
})
.controller('ctrl2',函数($scope){
功能clearCopy(范围){
var InternalPropertiesMap={
$$ChildScope:true,
$$childHead:对,
$$childTail:是的,
$$listenerCount:true,
$$侦听器:对,
$$nextSibling:对,
$$Previsibling:对,
$$观察者:没错,
$$watchersCount:正确,
$id:是的,
$parent:对
},
dest={};
对于(范围内的var i){
if(scope.hasOwnProperty(i)和&!internalpropertiesmap[i]){
dest[i]=范围[i];
}
}
返回目的地;
}
$scope.a=“测试”;
$scope.b={
x:1,
y:2
};
$scope.c=99;
$scope.copy2=clearCopy($scope);
}).控制器('ctrl3',功能($scope){
功能clearCopy(范围){
var InternalPropertiesMap={
$$ChildScope:true,
$$childHead:对,
$$childTail:是的,
$$listenerCount:true,
$$侦听器:对,
$$nextSibling:对,
$$Previsibling:对,
$$观察者:没错,
$$watchersCount:正确,
$id:是的,
$parent:对
};
返回对象。键(范围)。减少(功能(acc,el){
if(el[0]!='$'&&typeof作用域[el]!==“函数”){
acc[el]=范围[el];
}
返回acc;
}, {});
}
$scope.a=“测试”;