我有这样的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,请建议执行此类简单任务的最佳方法。
答案 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的手册。