Angular无法读取数组中的对象

时间:2015-03-12 11:50:32

标签: javascript arrays angularjs object

我有一个包含两个对象的数组,分配给$ scope.items;

当我做的时候

console.log($scope.items) 

输出是:

[
 {s: "item1", q: 3, $$hashKey: "object:3", population: Object},
 {s: "item2", q: 3, $$hashKey: "object:4", population: Object}
]

但是当我做的时候

console.log($scope.items[0]) 

输出(有时*)是:

{s: "item1", q: 3, $$hashKey: "object:3"}

'*这并不总是发生,取决于页面加载。刷新页面时,结果有时是人口,有时没有。

第一个输出始终完整,人口完好无损。 (无论我按f5多么疯狂的时间:) :)

我同时调用console.log。并按照与上述相同的顺序。

所以当我直接调用其中一个对象时,我不明白它们是不完整的?

它看起来像是一个解析错误,但是第一个输出怎么总是完整?

额外信息 $ scope.items是另一个数组的副本。

我使用$ http.get构建对象,但也尝试在其成功函数中调用console.logs。

$ http.get放在foreach中,因此在完整数组完成之前多次调用

我使用http.get构建人口。

我希望有人可以为我澄清这一点,这是怎么可能的。或如何继续寻找找到错误的可能性。

3 个答案:

答案 0 :(得分:1)

它不是角度的问题,它的谷歌铬的特征/问题。在谷歌浏览器中,当您控制任何对象时,它会显示name:object,当您展开它时,它指向实时内存位置,即使该内存位置在console.log之后更新,它也会以更新的输出进行扩展。

var d=[];

for(var i=0;i<100;i++){
    d[i]="val_"+i
}
console.log(d); //d[60] should be val_60 but will get value 'changed value' when you expand
console.log(d[60]); //will print 'val_60'

d[60]='changed value'

以下是您可以在浏览器中运行的示例代码,您将在控制台中获得奇怪的结果。

在您的情况下,您正在打印阵列,谷歌浏览器的控制台将指向该阵列的内存位置。并打印该数组,当您尝试扩展该数组时,它将从内存中获取进餐时间信息并显示您当前的数组状态。

解决方案是在chrome中使用调试器,并在该变量发生变化之前检查该变量。

另一个解决方案是使用JSON.stringify,

将该数组转换为字符串

答案 1 :(得分:1)

当您通过某种方法处理值之前,您所遇到的是竞争问题,您应该熟悉promises和$ http $ http的工作示例和它的承诺

http://plnkr.co/edit/QPB2JW8OAA4TiLgH1g6j?p=preview

$http.get()
.success(function() {
    $scope.data = [{
      s: "item1",
      q: 3,
      $$hashKey: "object:3"
    }, {
      s: "item2",
      q: 3,
      $$hashKey: "object:4"
    }]
    angular.forEach($scope.data, function(obj){
      obj.population = {}
    })
  })
  .finally(function() {
    console.log($scope.data[0].population)
  })

答案 2 :(得分:-1)

似乎在第一个控制台日志之后,某些事件正在从项目中删除填充字段,或者可能正在使用默认值重新启动项目。要更好地调试它,请使用JSON.strinfigy项目的结果记录对象,例如console.log(JSON.stringify($scope.items)

如果没有stringify,任何改变对象的代码/事件也会更新控制台日志。