【问题标题】:Listening for changes on Firebase监听 Firebase 的变化
【发布时间】:2017-03-07 00:57:36
【问题描述】:

我的 firebase 数据库具有以下结构:

{
  "gateways_pr" :{
    "gateway_1":{
        "avisos" : {
            "00":{
                "aviso_1" : "0",
                "aviso_2" : "0"
            },
            "01":{
                "aviso_1" : "0",
                "aviso_2" : "0"
            }

        }
    }
  }
}

我有一个小的演示 javascript 网页正在监听 gateways_pr/gateway_1/avisos 中的 child_change:

var gateWayRef = firebase.database().ref("gateways_pr/gateway_1/avisos");


gateWayRef.on('child_changed',function(data){
  console.log("CHILD_CHANGE");
  console.log(data.val()); 
  var datos = data.val(); 
  console.log(datos);
});

当我更改例如 gateway_1/avisos/00/aviso_1 并将其设置为 2 时,我可以使用 chrome 开发人员工具跟踪更改,查看 websocket 的框架并收到:

{"t":"d","d":{"b":{"p":"gateways_pr/gateway_1/avisos/00/aviso_1","d":"2"},"a":"d"}}

所以我只收到所做的更改。

问题是,在我的代码中,data.val() 具有以下值:

{aviso_1: "2", aviso_2: "0"}

调用 data.ref.path.toString() 返回:

/gateways_pr/gateway_1/avisos/00

这意味着 Firebase API 会向您显示其属性已更改的子级以下的所有内容(在本例中为 00)。

无论如何它都知道变化是什么(在这种情况下应该返回“aviso_1”)?

到目前为止,我发现的唯一解决方法是让我的代码能够倾听每个孩子的声音。在这种情况下,我应该收听 gateways_pr/gateway_1/avisos/00 和 gateways_pr/gateway_1/avisos/01,但是如果我向“avisos”添加新条目,我也应该开始收听它们,最后我的程序可以结束收听给成千上万的推荐人。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    当您将 child_changed 侦听器附加到 gateways_pr/gateway_1/avisos 时,您是在要求 Firebase 客户端在该级别下的子项发生更改时通知您。如果在较低级别发生更改,Firebase 客户端将在您注册的级别上引发 child_changed 事件。没有办法改变这种行为。

    当您需要准确了解侦听器下发生了什么变化时,这通常意味着您为您的用例错误地建模了数据。

    例如:如果您想监听整个层次结构的变化,您应该对整个层次结构的变化列表建模,然后将监听器附加到该列表。这是 Firebase 文档建议保持扁平数据结构的众多原因之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2019-06-28
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      相关资源
      最近更新 更多