如何放弃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()); });