角度无法读取数组中的对象

Angular cant read object in array

本文关键字:对象 数组 读取      更新时间:2023-09-26

我有一个数组,里面有两个对象,分配给$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:))

我同时调用控制台.log并且顺序与上述相同。

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

它看起来像一个解析错误,但第一个输出如何始终完整?

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

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

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

我使用http.get来建立人口。

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

这不是角度的问题,而是谷歌浏览器的功能/问题。在谷歌浏览器中,当您控制台任何对象时,它会显示 name:object,当您展开它时,它指向实时内存位置,即使该内存位置在控制台.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 将该数组转换为字符串,

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

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

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