使用AngularFire

时间:2015-05-17 21:13:16

标签: angularjs firebase 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聊天室内消息节点的长度。当房间页面内有更多消息时,将更新消息长度。因为我无法在像fire.Assray这样的firebaseArray中获取嵌套数组的长度,所以我将chatrooms数组循环到我的控制器中,如下所示:

$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具有实时更新(双向绑定)。但是,这是正确的解决方案吗?!在firebaseArray中获取数组对象的长度似乎太多了。如果我只是使用

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

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

messageCount始终更新。看起来很奇怪$ firebaseArray实际上让事情变得困难,而不是像#34; numChildren()&#34;那样提供辅助功能! Firebase Expert,请建议执行此类简单任务的最佳方法。

1 个答案:

答案 0 :(得分:1)

考虑到@FrankvanPuffelen的建议,我认为他是绝对正确的(我是Firebase和NoSQL noob)。每次用户发布消息时,我都可以看到控制台记录了这行的TWICE:console.log(messagesNode.length);这是每个聊天室!很多阅读报价。

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

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

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

我还希望了解有关Firebase报价的更多信息以及避免烧毁它们的更多最佳做法。就像什么时候关闭一个firebaseAarry完成后...我认为这是一个缺少firebase的手册。