2015-06-23 15 views
1

比方說,我在$scope中有幾個變量,我想創建一個包含這些變量的新對象,但沒有Angular在$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); 

我怎樣才能得到公正的相關數據?

+0

所以你想要'obj'持有a,b和c值嗎?或者你想'obj'來保存'$ scope'? –

+0

@SudhansuChoudhary我希望obj是一個帶有「a」,「b」和「c」鍵的對象,以及這些鍵的值。 – alexandernst

+0

我不知道這對你的數據量是否可行,但你可以改爲將'a,b,c'賦值給另一個對象,比如'$ scope.obj = {a:「test」,b:{x :1,y:2},c:99};'然後你只需要看看'$ scope.obj'。 – ryanyuyu

回答

0

一個可能的解決辦法是複製的屬性一個對象,在這種情況下$範圍,到另一個對象:

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

這將返回Angular存儲在'$ scope'中的所有東西。 – alexandernst

+0

確實,對不起,我沒有正確閱讀 – lfergon

2

你可以使用

this 

,而不是

$scope 

Plnkr

控制器:

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

    vm.a = 'test'; 

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

    vm.c = 123; 

    var obj = vm; 

}); 

我認爲,我顯示的每個連接到VM的值的。與虛擬機一樣,它僅顯示a,b和c作爲附加到VM的對象。

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

vm: {{vm}} 

UPDATE

如果你無法選擇無論是在$範圍或沒有,那麼這裏是使用$範圍 new plnkr

控制器:

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); 
}); 

obj的則是:

{a: "test", b: Object, c: 123} 
+0

我不擁有/控制'$ scope',我試圖從中獲取變量,所以我不能使用'this'。 – alexandernst

+0

使用$ scope更新我的答案,使用新的plnkr – jsuser

0

如果你滿意的使用下劃線,你可以做

var obj = _.extendOwn({}, $scope); 

否則在短短手動複製性一個循環

var obj = {}; 

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

請仔細閱讀問題。我不知道變量的名字。 – alexandernst

+0

這很容易。更新了我的答案。 –

+0

這不會起作用,因爲它會返回Angular存儲在'$ scope'中的所有東西。我只想要不屬於Angular的變量。 – alexandernst

1

$scope對象有幾個間隔屬性,從$開始,這樣的解決方法,你可以簡單地複製只是不是從$開始,甚至在地圖上創建的地圖內部$scope性質,如果財產沒有屬性 - 複製它。
注意:內部屬性的列表可以在不同角度版本

angular.module('app', []) 
 
    .controller('ctrl1', function($scope) { 
 
    function clearCopy(scope) { 
 
     var dest = {}; 
 
     for (var i in scope) { 
 
     if (scope.hasOwnProperty(i) && i[0] !== '$' && i !== 'this') { 
 
      dest[i] = scope[i]; 
 
     } 
 
     } 
 
     return dest; 
 
    } 
 
    $scope.a = "Test"; 
 
    $scope.b = { 
 
     x: 1, 
 
     y: 2 
 
    }; 
 
    $scope.c = 99; 
 

 
    $scope.copy1 = clearCopy($scope); 
 
    }) 
 
    .controller('ctrl2', function($scope) { 
 
    function clearCopy(scope) { 
 
     var internalProperiesMap = { 
 
      $$ChildScope: true, 
 
      $$childHead: true, 
 
      $$childTail: true, 
 
      $$listenerCount: true, 
 
      $$listeners: true, 
 
      $$nextSibling: true, 
 
      $$prevSibling: true, 
 
      $$watchers: true, 
 
      $$watchersCount: true, 
 
      $id: true, 
 
      $parent: true 
 
     }, 
 
     dest = {}; 
 
     for (var i in scope) { 
 
     if (scope.hasOwnProperty(i) && !internalProperiesMap[i]) { 
 
      dest[i] = scope[i]; 
 
     } 
 
     } 
 
     return dest; 
 
    } 
 
    $scope.a = "Test"; 
 
    $scope.b = { 
 
     x: 1, 
 
     y: 2 
 
    }; 
 
    $scope.c = 99; 
 
    $scope.copy2 = clearCopy($scope); 
 
    }).controller('ctrl3', function($scope) { 
 
    function clearCopy(scope) { 
 
     var internalProperiesMap = { 
 
     $$ChildScope: true, 
 
     $$childHead: true, 
 
     $$childTail: true, 
 
     $$listenerCount: true, 
 
     $$listeners: true, 
 
     $$nextSibling: true, 
 
     $$prevSibling: true, 
 
     $$watchers: true, 
 
     $$watchersCount: true, 
 
     $id: true, 
 
     $parent: true 
 
     }; 
 
     return Object.keys(scope).reduce(function(acc, el) { 
 
     if (el[0] !== '$' && typeof scope[el] !== "function") { 
 
      acc[el] = scope[el]; 
 
     } 
 
     return acc; 
 
     }, {}); 
 
    } 
 
    $scope.a = "Test"; 
 
    $scope.b = { 
 
     x: 1, 
 
     y: 2 
 
    }; 
 
    $scope.c = 99; 
 
    $scope.fun = function(d){return d;}; 
 

 
    $scope.copy3 = clearCopy($scope); 
 
    console.log($scope.copy3); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.js"></script> 
 
<div ng-app='app'> 
 
    <div ng-controller='ctrl1'>copy 1: {{copy1}}</div> 
 
    <div ng-controller='ctrl2'>copy 2: {{copy2}}</div> 
 
    <div ng-controller='ctrl3'>copy 3: {{copy3}}</div> 
 
</div>

但無論如何,它似乎像XY problem

1

不同,我不能相信我居然提示這個。你應該真的重構你的代碼,所以你不必這樣做。不論您是否確實需要通過所有的鍵做到這一點...

$scope.test = 4; 
var copiedObject = {}; 
for(var key in $scope){ 
    if(key[0] != '$' && key != 'this'){ 
     copiedObject[key] = $scope[key]; 
    } 
} 
console.log(copiedObject); 

這將循環和撕裂了角具體的東西。下面是它的jsfiddle:

http://jsfiddle.net/n8bz4L7e/

注:如果你有對象,引用或保存某種原因,這將複製那些過度以及其他$範圍內的變量。正如其他人提到的,這很可能是XY問題。

+1

也在'1.4'版本中'$ scope'沒有屬性'this ':-) – Grundy

+0

好吧,這似乎是我能得到的下一個最好的東西。不過,我會添加更多的類型檢查的條件。 if($ scope.hasOwnProperty(key)&& key!==「this」&& key.indexOf(「$」)!== 0 && typeof($ scope [key])!==「function」)''。 – alexandernst

+0

@alexandernst,'key.indexOf(「$」)!== 0'不需要,methinks,'key [0]!=='$''足夠簡單 – Grundy

0

我忽略的範圍或(往往先從$)任何功能的任何角度的變量,也注入$ rootScope使得從$rootScope$scope沒有繼承屬性將被複制到新的對象,obj並紛紛拿出與此,

<script> 
var app = angular.module('myApp', []); 
app.controller('myCtrl', function($scope, $rootScope) { 
    $scope.a = "Test"; 
$scope.b = {x: 1, y: 2}; 
$scope.c = 99; 
var obj = {}; 
angular.extend(obj, $scope); 
console.log("obj is "+obj); 
for(var k in $scope) { 
    if(!(Object.hasOwnProperty.call($rootScope, k))) { 
if(typeof $scope[k] != "function") 
if(k.indexOf("$") != 0){ 
     obj[k] = $scope[k]; 
console.log("key is "+k); 
console.log("value is "+obj[k]); 
    } 
} 
} 
}); 
</script> 
相關問題