使用 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 缺少的手册。
我有一个这样的 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 缺少的手册。