2

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

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

谢谢,蒂姆

4

3 回答 3

7

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 ​​秒内收到的任何消息都不会闪烁标题。

希望有帮助!

于 2012-10-12T02:03:56.870 回答
4

您可以使用此 SO question中的方法设置仅接收新事件而不是现有事件的呼叫。

所以基本上,.on('child_added'...)endAtand打电话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());

});
于 2012-10-12T01:52:59.320 回答
3

我想我会更新加藤的答案,因为 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;
  });

我希望这有帮助

于 2015-03-14T17:06:01.850 回答