有没有办法知道Child Added被称为什么情况?特别是页面加载与其他事件

时间:2012-10-12 00:55:13

标签: firebase

这是我的情景。当通过浏览器事件帖子页面加载添加子项时,我想在标题中指出它。但是在页面加载时,也会调用添加的子项。

如何区分添加的初始子项与实际添加新条目的子项。

谢谢,蒂姆

3 个答案:

答案 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;
  });

我希望这会有所帮助