在Firebase上收听更改

时间:2017-03-06 16:04:13

标签: javascript firebase firebase-realtime-database

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

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

        }
    }
  }
}

我有一个小型的演示javascript webPage,它正在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”添加新条目,我也应该开始听它们,最后我的程序可能会结束监听成千上万的参考。

1 个答案:

答案 0 :(得分:1)

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

当您需要准确了解监听器下的更改时,通常意味着您已根据用例对数据建模错误。

例如:如果要监听整个层次结构中的更改,则应在整个层次结构中建模更改列表,然后将侦听器附加到该列表。这是Firebase文档建议保留平面数据结构的众多原因之一。