Angular 无法读取数组中的对象

Angular cant read object in array

我有一个包含两个对象的数组,分配给 $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 来建立人口。

我希望有人能为我澄清一下,这怎么可能。或howto继续寻找找到错误的可能性。

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

没有 stringify,任何 code/event 正在改变对象的也会更新控制台日志。

这不是 angular 的问题,而是 google chrome 的 feature/problem。在googlechrome中,当你console任何对象时,它显示name:object,当你展开它时,它指向实时内存位置,即使那个内存位置在[=之后更新了23=],它用更新的输出扩展。

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'

这是一个示例代码,您可以在浏览器中 运行 并在控制台中得到奇怪的结果。

在您的例子中,您正在打印一个数组,google chrome 的控制台将指向该数组的内存位置。并打印该数组,当您尝试扩展该数组时,它将从内存中获取进餐时间信息并显示数组的当前状态。

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

另一种解决方案是使用 JSON.stringify、

将该数组转换为字符串

当您在通过某种方法处理之前记录值时,您面临的是一个竞争问题,您应该熟悉 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)
  })