15

我正在制作一个简单的应用程序,通知客户其他客户点击了一个按钮。我使用以下方法将点击存储在 Firebase ( db) 中:

db.push({msg:data});

所有客户端都会收到其他用户点击的通知on,例如

db.on('child_added',function(snapshot) { 
  var msg = snapshot.val().msg; 
});

但是,当页面首次加载时,我想丢弃堆栈上的任何现有数据。我的策略是db.once()在我定义之前调用db.on('child_added',...)以获得初始的孩子数量,然后使用它来丢弃对db.on('child_added',...).

不幸的是,所有对 db.on('child_added',...) 的调用都发生我能够获得初始计数之前,所以它失败了。

我怎样才能有效而简单地丢弃初始数据?

4

2 回答 2

26

对于更大的数据集,Firebase 现在提供(从 2.0 开始)一些可以简化此操作的查询方法。

如果我们在每条记录上添加一个时间戳字段,我们可以构造一个只查看新值的查询。考虑这个人为的数据:

{
  "messages": {
     "$messageid": {
        "sender": "kato",
        "message": "hello world"
        "created": 123456  // Firebase.ServerValue.TIMESTAMP
     }
  }
}

我们只能在“现在”之后使用以下内容找到消息:

var ref = new Firebase('https://<your instance>.firebaseio.com/messages');

var queryRef = ref.orderBy('created').startAt(Firebase.ServerValue.TIMESTAMP);

queryRef.on('child_added', function(snap) {
  console.log(snap.val());
});
于 2014-12-29T17:26:21.743 回答
17

如果我正确理解您的问题,听起来您想要自用户访问该页面以来添加的数据。在 Firebase 中,您描述的行为是设计使然,因为数据总是在变化,并且没有“旧”数据与“新”数据的概念。

但是,如果您只想显示页面加载后添加的数据,请尝试忽略之前的所有事件,直到完整的子项集至少加载一次。例如:

var ignoreItems = true;
var ref = new Firebase('https://<your-Firebase>.firebaseio.com');
ref.on('child_added', function(snapshot) {
  if (!ignoreItems) {
    var msg = snapshot.val().msg;
    // do something here
  }
});
ref.once('value', function(snapshot) {
  ignoreItems = false;
});

这种方法的替代方法是编写具有优先级的新项目,优先级是Firebase.ServerValue.TIMESTAMP(当前服务器时间),然后使用.startAt(...)当前时间戳进行查询。然而,这比上述方法更复杂。

于 2013-11-09T23:15:11.010 回答