这是我的场景。当通过浏览器事件发布页面加载添加孩子时,我想在标题中指出它。但是在页面加载时,也会调用添加的子项。
如何区分添加的初始子项与实际添加了新条目的子项。
谢谢,蒂姆
这是我的场景。当通过浏览器事件发布页面加载添加孩子时,我想在标题中指出它。但是在页面加载时,也会调用添加的子项。
如何区分添加的初始子项与实际添加了新条目的子项。
谢谢,蒂姆
Firebase 非常有意地不区分“初始”数据和“新”数据。在大多数情况下,这允许更简单的开发,因为您只需为数据编写一组逻辑,而不是同时处理初始数据案例和新数据案例。
在这种情况下,我可以看到您希望如何区分。我不确定你在做什么,但如果你正在构建一个聊天应用程序,你可能希望根据最新消息的时间戳而不是它是否是“新”消息来闪烁标题。如果在页面加载之前发送消息,这将允许标题在页面加载时闪烁,这可能是可取的。在其他一些情况下,您可能实际上想要为未读数据闪烁标题,并且您可能需要考虑将子项标记为“已读”,并且只为没有“已读”位出现的子项闪烁标题。这将允许事情在页面刷新之间无缝地工作。
如果您绝对需要知道“新”数据何时出现,您可以尝试使用带有“值”事件类型的“once”来获取数据,然后使用带有 startAt 查询和“child_added”事件类型的“on”之后显示新数据。它看起来像这样:
var data = new Firebase(...);
data.once("value", function(d) {
//TODO: display initial state...
data.startAt(null, <last id in snapshot>).on("child_added", function(newMessSnapshot) {
//TODO: render new child and flash title bar.
}
}
或者,如果您想以非常简单的方式进行操作,您可以设置一个计时器,以便在页面加载的前 N 秒内收到的任何消息都不会闪烁标题。
希望有帮助!
您可以使用此 SO question中的方法设置仅接收新事件而不是现有事件的呼叫。
所以基本上,.on('child_added'...)
用endAt
and打电话limit
。你仍然会得到一个条目(最后一个),你可以忽略它:
// connect to firebase
var fb = new Firebase(...);
// retrieve the last record from `ref` (endAt() tells it to start at the end)
var first = true;
fb.child('table_name').endAt().limit(1).on('child_added', function(snapshot) {
if( first ) {
// ignore the first snapshot, which is an existing record
first = false;
return;
}
// all records after the last continue to invoke this function
console.log(snapshot.name(), snapshot.val());
});
我想我会更新加藤的答案,因为 Datasnapshot.name() 和 limit 现在都已贬值。
我决定让它更简单一点;)
// connect to firebase
var fb = new Firebase("https://your-firebase-ref/");
var firstTime = false;
fb.limitToLast(1).on('child_added', function(snapshot) {
if (firstTime) {
console.log(snapshot.key(), snapshot.val());
};
firstTime = true;
});
我希望这有帮助