如何放弃Firebase数据库中的初始数据

我正在做一个简单的应用程序,通知客户端其他客户端点击一个button。 我将点击数据存储在Firebase( db )中,使用:

 db.push({msg:data}); 

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

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

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

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

我怎样才能有效和简单地丢弃最初的数据?

如果我正确理解你的问题,这听起来像你想要用户访问页面后添加的数据。 在Firebase中,您描述的行为是通过devise来实现的,因为数据总是在变化,没有“旧”数据和“新”数据的概念。

但是,如果只想显示在页面加载后添加的数据,请尝试先忽略所有事件,直到完整的子组至less加载一次。 例如:

 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(...)查询使用当前时间戳。 但是,这比上面描述的方法更复杂。

对于更大的数据集,Firebase现在提供了一些查询方法(从2.0开始),可以使这个更简单。

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

 { "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()); });