AngularJS AngularFire Firebase不能迭代firebase数据

时间:2017-11-20 00:11:57

标签: angularjs firebase firebase-realtime-database angularfire

我在AngularJS项目中使用AngularFire。在以下HTML中,您可以看到我将quote项目传递到控制器中的total_votes函数。

    <div ng-repeat="quote in quotes" ng-init="total_votes(quote)">
        {{quote.name}}
    </div>

这是quotes来自

的地方
    // get quotes
    var ref = firebase.database().ref().child('quotes');
    $scope.quotes_obj = $firebaseObject(ref);
    $rootScope.quotes = $firebaseArray(ref);

这就是函数的样子

    $scope.total_votes = function(itm) {
        console.log(itm.votes)
        console.log(itm.votes)
        console.log(itm.votes[0])
        console.log(itm.votes.length)
    };

这是印刷的内容

console.log(itm.votes)

    {
      "quote": "untitled",
      "recorded_by": "-KzFkQYHWKwbAPjIekWz",
      "votes": {
        "-KzFkQYHWKwbAPjIekWz": "sad",
        "-KzLT76T14doKgYbjRc1": "wow"
      },
      "who": "null",
      "$id": "-KzKz7EyCSPkPl0YDvfa",
      "$priority": null,
      "$$hashKey": "object:15"
    }

console.log(itm.votes) {&#34; -KzFkQYHWKwbAPjIekWz&#34;:&#34;悲伤&#34;&#34; -KzLT76T14doKgYbjRc1&#34;:&#34;哇&#34;}

console.log(itm.votes[0]) 未定义

console.log(itm.votes.length) 未定义

如何从引号中迭代投票?为什么长度未定义?为什么我不能通过像itm.votes[0]这样的索引来获取单个项目?

1 个答案:

答案 0 :(得分:1)

请注意,$firebaseObject()$firebaseArray()是异步的。您必须等待数据通过网络下载。虽然这通常不会花费很长时间,但仍然意味着它不会立即可用。

由于AngularJS的脏检查系统,您会在视图中看到数据。当数据可用时,Angular会自动填充视图,因为它知道$ scope的值。

I've written about this in a blog post and done a screencast covering it as well.

您可以使用ng-repeat在视图中迭代数据。

<div ng-repeat="item in items">
  {{ item }}
</div>

通过这种方式,您可以依赖视图来始终更新数据。

在你的情况下,这将是棘手的,因为你的&#34;投票&#34;嵌套在你的&#34;引号&#34;中。我强烈建议打破&#34;投票&#34;到他们自己的顶级数据结构。为了保持关系,你可以在他们之间分享关键。

{
  "quotes": {
     "a": {
        "name": "A"
     }
  },
  "votes": {
     "a": {
        "count:" 11
     }
  }
} 

或者,您可以使用路由器解析来使用$ loaded promises来解析数据。博客文章涵盖的内容。