我正在创建一个简单的应用程序,通知客户端其他客户端点击了一个按钮。我使用以下内容将点击次数存储在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',...)的调用都发生在之前我能够获得初始计数,所以它失败了。
如何有效而简单地丢弃初始数据?
答案 0 :(得分:25)
对于较大的数据集,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());
});
答案 1 :(得分:15)
如果我正确理解您的问题,听起来您仅想要自用户访问该页面后添加的数据。在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(...)
查询时间戳。但是,这比上述方法更复杂。