加载最后3个和每个新孩子

时间:2015-11-17 21:28:17

标签: javascript angularjs firebase angularfire

获取最后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;
})

2 个答案:

答案 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);

Official documentation语录:

  

这是一个适合在指令中使用的PSEUDO READ-ONLY ARRAY   ng-repeat和Angular过滤器(期望一个数组)。

另一个注意事项是,使用此服务push()splice()和其他功能将使阵列无法更新。因此,请使用文档中建议的特定API。例如,$ add而不是push()

进一步参考和示例here