获取最后3条消息并将所有新消息追加/推送到数组中的最佳方法是什么?以下是否可以?如果我想使用$ firebaseArray怎么办?
var messages = [];
ref.child('messages').limitToLast(3).on('child_added', function(snap){
messages.push(snap.val());
});
var tempMessages = $firebaseArray(ref.child('messages').limitToLast(3));
messages.$loaded(function(data){
messages = data;
})
答案 0 :(得分:1)
您秘密想要的是范围查询。
你想从最后三个开始,然后继续听。您可以使用.start()
函数创建范围查询。一旦你知道从哪里开始范围,你就可以从最后3条消息开始,然后在每条消息之后得到每条消息。
Here's a JSBin demo of the last three messages, plus any newly added messages
问题是你要知道倒数第三个关键字是什么。
为此,我们将对最后三个进行初始查询,获取倒数第三个键,然后运行我们的范围查询。最好使用.once
函数,因为我们只关心最后三个项目。
function LimitMessagesArray(Ref, $q) {
// return a function so we can alter the limit amount
return function LimitMessagesArray(lastLimit) {
var limitQuery = Ref.child('messages').limitToLast(lastLimit);
// Since it's a one time read we'll use a promise
var deferred = $q.defer();
// Reading only once is necessary
limitQuery.once('value', function(snap) {
var newMessages = [];
// iterate through the snapshot and keep the key around
snap.forEach(function(childSnap) {
var newMessage = childSnap.val();
newMessage.$key = childSnap.key();
newMessages.push(newMessage);
});
// resolve the last 'N' messages
deferred.resolve(newMessages);
});
return deferred.promise;
};
}
现在,我们在promise实现的数组中有最后的'N'个消息。我们想要使用数组的第一个键并使用它来启动范围查询。为了使这更容易,我们将为工厂创建一系列消息。
function StartAtMessagesArray(Ref, $firebaseArray) {
return function StartAtMessagesArray(startingKey) {
var rangeQuery = Ref.child('messages').orderByKey().startAt(startingKey);
return $firebaseArray(rangeQuery);
};
}
一旦我们有这两个部分,我们可以一起使用它们来收听最后三条消息以及所有新添加的消息。
function MyController($scope, limitMessages, startAtMessages, Ref) {
var lastThreeMessages = limitMessages(3);
// When the last three messages load get the first key
lastThreeMessages.then(function(data) {
var startingKey = data[0].$key;
// Create the sync array of messages from the starting key
$scope.messages = startAtMessages(startingKey);
});
}
答案 1 :(得分:-1)
将firebaseArray()
注入控制器并定义您想要数组的引用。例如:
app.controller("Ctrl", ["$scope", "$firebaseArray",
function($scope, $firebaseArray) {
var desiredRef = new Firebase("URL of your app ");
现在为firebaseArray(desiredRef)
-
$scope.tempMessages = $firebaseArray(desiredRef);
通过相同的firebaseArray()
服务,您可以使用query()
获取最后三条消息 -
var query = desiredRef.orderByChild("timestamp").limitToLast(3);
//create another array for last(3)
$scope.lastThree = firebaseArray(query);
这是一个适合在指令中使用的PSEUDO READ-ONLY ARRAY ng-repeat和Angular过滤器(期望一个数组)。
另一个注意事项是,使用此服务push()
,splice()
和其他功能将使阵列无法更新。因此,请使用文档中建议的特定API。例如,$ add而不是push()
。
进一步参考和示例here。