2015-06-23 2 views
1

Предположим, что у меня есть несколько переменных в $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); 

Как я могу получить только соответствующие данные?

+0

, так что вы хотите иметь значения 'obj' hold, a и b? или вы хотите, чтобы '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. Также как 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); 
}); 

Объект сос затем:

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

Я не владею/не управляю '$ scope', из которого я пытаюсь получить переменные, поэтому я не могу использовать' this'. – alexandernst

+0

Обновлен ответ с новым plnkr использованием $ scope – 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'. Я хочу только переменные, которые не принадлежат Угловому. – 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> 
Смежные вопросы