2014-06-19 38 views
0

我不認爲這是一個真正的角度問題,雖然我在使用角度ng-repeat指令時偶然發現了問題。將對象字面值推入數組(重複自己..)

我試圖將JavaScript對象文字存儲到數組中使用推,所以我可以遍歷ng-repeat。

例如:

$scope.items = []; 

var item = { 
    name: "bob" 
}; 

$scope.items.push(item); 
item.name = "mary"; 
$scope.items.push(item); 

在這一點上,$ scope.items []被保持,而不必Bob和瑪麗名稱瑪麗的2個實例。這是違反直覺的,因爲我認爲push只是將下一個項目追加到數組的末尾。

我真正的代碼(總結)變爲像下面:

$scope.items = []; 

var item = { 
    name: ""; 
}; 

for (var i = 0; i < 10; i++) { 
    // I dynamically set the item.name to some value using retrieved values from server 
    item.name = someValueFromServer; 

    $scope.items.push(item); 
} 

所以,再一次,在for循環的結束,而不是有10名不同的名字,我有相同的10名最後一個被檢索到。

我無法弄清楚如何解決這個問題,也無法在網上找到任何東西。我對此很新,所以可能一直在尋找錯誤的東西。

任何幫助都會很棒。非常感謝!

+1

對象是引用;你在推動同一個對象。 – elclanrs

+0

如何推送新的參考? –

+0

$ scope.items.push(angular.copy(item))將深度複製對象,而不是對它的引用。 –

回答

1

如前所述,您將對象引用推入scope.items,然後更改對象。使所有的引用都被更新。

這裏有一些選擇:

var scope = {}; 
scope.items = []; 
var arr = [1,2,3,4,5]; 

//Passing an anonymous object 
for(var i = 0, len = arr.length; i < len; i++){ 
    scope.items.push({name: arr[i]}); 
} 

console.log(scope.items); ////[ { name: 1 }, { name: 2 }, { name: 3 }, { name: 4 }, { name: 5 } ] 

function Item(value){ 
    this.value = value; 
} 

//Or with a defined object 
scope.items2 = []; 

for(var i =0, len =arr.length; i < len; i++){ 
    scope.items2.push(new Item(arr[i])); 
} 

console.log(scope.items2); //[ { value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }, { value: 5 } ] 

//Or to declare item inside of the for loop, so that it is reinitialized each time 
scope.items3 = []; 

for(var i =0, len = arr.length; i < len; i++){ 
    var item = { name: 'somevalue ' + i }; 
    scope.items3.push(item); 
} 

console.log(scope.items3); /*[ { name: 'somevalue 0' }, 
          { name: 'somevalue 1' }, 
          { name: 'somevalue 2' }, 
          { name: 'somevalue 3' }, 
          { name: 'somevalue 4' } ]*/ 
2

每次都會覆蓋同一個對象。

for (var i = 0; i < 10; i++) { 
    var item = { 
     name: someValueFromServer; 
    }; 
    $scope.items.push(item); 
} 
+0

我現在遠離電腦,但一有機會我就馬上檢查一下。雖然有道理,謝謝先生! :) –