【问题标题】:firebase child_added event issuefirebase child_added 事件问题
【发布时间】:2018-05-13 18:42:02
【问题描述】:

我想在推送时从 firebase 数据库中获取最近添加的子节点,但根本不是数据库的最后一个子节点。

问题是典型的child_added 事件无论如何都会得到最后一个孩子,即使是在第一次加载页面时也是如此。

即使此时没有添加新节点,此代码也会输出最后一个子节点。

firebase.database().ref("coupons").limitToLast(1).on('child_added', function(snapshot) {
   console.log(snapshot.val());
});

这个“hack”现在对我有用,但是如何以适当的方式重写它?

firebase.database().ref().on('child_changed', function() { // listen only when there are some changes in entire db, the key solution for this purpose.
   firebase.database().ref("coupons").limitToLast(1).on('child_added', function(snapshot) {
      console.log(snapshot.val());
   });
});

那么,如果此时没有添加新节点,为什么只有 child_added 监听器起作用?

【问题讨论】:

  • 这是根据documentation 的预期行为“此事件将在此位置的每个初始子项触发一次,并且每次新的添加了孩子...”
  • 那么,我的“hack”是合法的吗? :)
  • 不,这个“黑客”被窃听了:(
  • 我真的不建议这样做。 firebase.database().ref().on() 将下载整个数据库,这对客户端来说将是数据密集型的。也许使用'value' 而不是'child_added' 并使用布尔值来跟踪它第一次被触发并忽略这次?我看看能不能想点别的。
  • @JenPerson 在这种情况下 OP 正在使用 on('child_changed ,因此不会下载整个数据库。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

我通过分配一个 bool var 来检查第一次启动以在页面加载时跳过 firebase 事件来解决这个问题。

var child_added_first = true;
firebase.database().ref("coupons").limitToLast(1).on('child_added', function(snapshot) {
   if (!child_added_first) {
      console.log(snapshot.val());
   }
   child_added_first = false;
});

此外,当我只是从控制台面板中的 firebase 数据库中删除一些节点时,客户端上的 firebase 会触发“child_added”。为什么?

似乎是时候看看其他一些具有更友好 api 和文档的实时 SaaS 数据库了。

【讨论】:

    【解决方案2】:

    如果你有时间节点,可以试试下面的代码。

    firebase.database().ref("coupons")
    .orderByChild('time').startAt(Date.now())
    .limitToLast(1).on('child_added', function(snapshot) {
       console.log(snapshot.val());
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多