这是我的情景。当通过浏览器事件帖子页面加载添加子项时,我想在标题中指出它。但是在页面加载时,也会调用添加的子项。
如何区分添加的初始子项与实际添加新条目的子项。
谢谢,蒂姆
答案 0 :(得分:7)
Firebase非常故意不将“初始”数据与“新”数据区分开来。在大多数情况下,这允许更简单的开发,因为您只需要为数据编写一组逻辑,而不是同时处理初始数据案例和新数据案例。
在这种情况下,我可以看到你希望如何区分。我不确定你到底在做什么,但是如果你正在构建一个聊天应用程序,你可能想根据最新消息的时间戳来刷新标题,而不是它是否是“新”消息。如果在加载页面之前稍微发送消息,这将允许标题在页面加载时闪烁,这可能是期望的。在其他一些情况下,您可能实际上想要为未读数据刷新标题,并且您可能需要考虑将子项标记为“已读”并仅为显示没有“读取”位的子项闪烁标题。这样可以在页面刷新过程中无缝地工作。
如果您绝对需要知道“新”数据何时显示,您可以尝试使用“一次”和“值”事件类型来获取数据,然后使用“on”和startAt查询以及“child_added” “事件类型,以便在此之后显示新数据。它看起来像这样:
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秒内收到的任何消息都不会闪烁标题。 / p>
希望有所帮助!
答案 1 :(得分:3)
您可以设置仅接收新事件的呼叫,而不是使用方法from this SO question已经存在的事件。
所以基本上,请.on('child_added'...)
和endAt
致电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());
});
答案 2 :(得分:3)
我以为我会更新Kato的答案,因为Datasnapshot.name()和限制现在都已经过折旧。
我决定让它变得更简单;)
// 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;
});
我希望这会有所帮助