Firebase 有没有办法知道在什么样的上下文中,Child Added被称为?特别是页面加载与其他事件

Firebase 有没有办法知道在什么样的上下文中,Child Added被称为?特别是页面加载与其他事件,firebase,Firebase,这是我的设想。当通过浏览器事件post页面加载添加子项时,我希望在标题中指明它。但在页面加载时,也会调用添加的child 如何区分添加的初始子项与实际添加了新项的子项 谢谢,Tim您可以使用该方法设置一个只接收新事件而不是已存在事件的呼叫 因此,基本上,使用endAt和limit调用.on('child_added'…)。您仍然会得到一个条目(最后一个),您可以忽略它: // connect to firebase var fb = new Firebase(...); // retrieve

这是我的设想。当通过浏览器事件post页面加载添加子项时,我希望在标题中指明它。但在页面加载时,也会调用添加的child

如何区分添加的初始子项与实际添加了新项的子项


谢谢,Tim

您可以使用该方法设置一个只接收新事件而不是已存在事件的呼叫

因此,基本上,使用
endAt
limit
调用
.on('child_added'…)
。您仍然会得到一个条目(最后一个),您可以忽略它:

// 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());

});

Firebase故意不区分“初始”数据和“新”数据。这允许在大多数情况下进行更简单的开发,因为您只需为数据编写一组逻辑,而不必同时处理初始数据案例和新数据案例

我知道你希望在这种情况下有什么区别。我不确定你到底在做什么,但是如果你正在构建一个聊天应用程序,你可能希望根据最近消息的时间戳来刷新标题,而不是根据它是否是一条“新”消息。如果在页面加载之前发送了一条消息,这将允许页面加载时标题闪烁,这可能是可取的。在其他一些情况下,您可能实际上希望为未读数据闪出标题,并且您可能想考虑将孩子标记为“Read”,并只为未显示“读取”位的儿童闪烁标题。这将允许跨页面刷新无缝地工作

如果您确实需要知道“新”数据何时显示,您可以尝试使用带有“值”事件类型的“一次”来获取数据,然后使用带有startAt查询的“on”和“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.
  }
}
var数据=新的Firebase(…);
数据。一次(“值”,函数(d){
//TODO:显示初始状态。。。
data.startAt(null,).on(“添加了子项”),函数(newMessSnapshot){
//TODO:渲染新子级和flash标题栏。
}
}
或者,如果你想用一种非常简单的方法,你可以设置一个计时器,这样在页面加载的前N秒内,任何消息的标题都不会闪烁


希望这能有所帮助!

我想我会更新加藤的答案,因为Datasnapshot.name()和limit现在都贬值了

我决定把它也简化一点;)

//连接到firebase
var fb=新的火基(“https://your-firebase-ref/");
var firstTime=假;
fb.limitToLast(1).on('child_added',函数(快照){
如果(第一次){
log(snapshot.key(),snapshot.val());
};
第一次=正确;

});
你的第二个计划正是我想要的。我不想管理阅读状态。(我的应用程序是一个实时发布平台。我希望人们打开它并保持打开状态,但对电脑上的其他操作模糊。如果有新帖子,我希望标题显示警告)太好了!你能把答案标记为正确的解决方案,这样其他人就能找到它吗?你知道。想法3开始吸引我了。不是我的开发者,而是我的应用开发者。如果我在初始页面加载时有多达5个“旧”的最后通知。现在我只想听新的通知。因为当通知进来时,我是拍摄对后端的ajax调用。因此,为了避免每次在页面加载时对后端执行最多5次ajax调用,我只需要在页面加载时对后端执行一次ajax调用,然后在页面打开时,对每个添加的新子项执行ajax请求。我假设这里可以进行时间戳比较。您可能正在寻找以下内容:我也会ping您,@Jon.如果我
limitToLast(5)
这样我就可以在页面加载时收到最多5个通知,那该怎么办?在这种情况下,计数器不会有帮助,因为我不知道页面加载时预期的对象的确切数量,它可以是0到5之间的任何数量。我还在@Kato-answer下问了同样的问题