使用 AngularFire 在 firebaseArray 中获取对象数组长度

Getting an object array length inside an firebaseArray with AngularFire

我有一个这样的 Firebase 结构:

Chatrooms {
  -efsCsTB95 {
    Messages {
      -bdre3G5 {
         Title: ...
          }
      -wer23bd {
         Title: ...
          }
     }
   }
}

我的看法是这样的:

<div class="card" ng-repeat="list in chatrooms">
    <div class="item item-positive item-text-wrap">
        {{list.videoTitle}}
    </div>
    <div class="item item-stable">
        <div class="card-footer text-right">
            <i class="icon ion-chatbox-working positive"></i>
            <b class="positive">{{list.messageCount}}</b>
        </div>
    </div>
</div>

list.messageCount 尝试获取 firebaseAarry 聊天室中消息节点的长度。当房间页面内有更多消息时,消息长度将被更新。由于我无法像 list.messages.length 那样获取 firebaseArray 中嵌套数组的长度,因此我在我的控制器中循环聊天室数组,如下所示:

$scope.chatrooms = $firebaseArray($scope.chatroomsRef);

    $scope.chatrooms.$loaded()
    .then(function(){
        angular.forEach($scope.chatrooms, function(room, key) {
            var messagesRef = $rootScope.baseUrl + "chatrooms/" + room.$id + "/messages/";
            console.log (messagesRef);
            var messagesNode = $firebaseArray(new Firebase(messagesRef));
            messagesNode.$loaded().then(function(){
                console.log (messagesNode.length);
                $scope.chatrooms[key].messageCount = messagesNode.length;
            });
            $scope.chatrooms.$watch(function() {
                messagesNode.$loaded().then(function(){
                    console.log (messagesNode.length);
                    $scope.chatrooms[key].messageCount = messagesNode.length;
                });
            });
        });
    });

在每个循环中,我打开另一个名为 messagesNode 的 $firebaseArray 连接。我等到 messagesNode 加载了 $loaded,然后将其赋予一个名为 messageCount 的新本地属性,附加到每个房间。当有更多消息添加到房间时,我使用 $watch 重新获取长度并将其重新附加到 messageCount。

所以这个解决方案有效。 list.messageCount 有实时更新(2 向绑定)。但是,这是正确的解决方案吗?!仅获取 firebaseArray 中数组对象的长度似乎工作量太大。如果我只使用

$scope.chatroomsRef.on('child_added', function(snapshot){

        var snapshotVal = snapshot.val();
        var messageCount = snapshot.child('messages').numChildren(); });

messageCount 始终更新。看起来很奇怪 $firebaseArray 实际上让事情变得困难而不是提供像 "numChildren()" 这样的辅助函数?! Firebase 专家,请建议执行此类简单任务的最佳方法。

采纳@FrankvanPuffelen 的建议,我认为他是绝对正确的(我是 Firebase 和 NoSQL 菜鸟)。每次用户 post 一条消息,我都可以看到控制台记录了这一行的两次:console.log (messagesNode.length);这是给每个聊天室的!!大量阅读报价。

所以我确实需要评论数。所以解决方案是,每次用户评论时,我添加此代码:

roomRef.child("messageCounter").transaction(function(Counter) {
                    return Counter+1;
                });

使用事务更新计数器并将其存储到聊天室节点上。所以在视图中,我只是将{{list.messageCount}}替换为{{list.messageCounter}},这是聊天室下的一个节点。无需计算评论等。

我也很想了解更多关于 Firebase 报价的信息和更多避免烧掉它们的最佳实践。就像完成后何时关闭 firebaseAarry 一样......我认为这是 firebase 缺少的手册。