Firebase将数据从Firebase检索到HTML表中

时间:2019-08-21 07:41:20

标签: javascript html firebase firebase-realtime-database

是否有一种解决方案,可将节点的所有值从Firebase实时数据库检索到html表中?我想将IOT传感器数据从Firebase显示到html表中?每次在湿度中添加新值时,温度都会进入html表的新行吗?怎么做?

#include <glib.h>
#include <NetworkManager.h>

我尝试了这段代码,但是我在HTML表中仅得到一行,并且它显示湿度,温度和湿度节点的最后一个子值。控制台显示所有值,但它们在HTML表中仅一行。

 agrismart-c7cb0
 .
 .
     ---  ...Sensor
          ----- .Humidity
                 . -Ll1yRHBqZUSQUpAANYl: "64"
                 . -Ll1ySD9oG5fiia15eL0: "65"
                 . -Ll1yTrQnmS0T1ImusKQ: "68"
                 . -Ll1yVjd3wZi48jp9SB1: "65"
          ----- .Moisture
                 .  -LlQz7gIlHBKWT66T2gS: "96"
                 .  -LlQz80sa4qoOZvOSKPn: "95"
                 .  -LlQz8IlfBnlIy0FQZoM: "99"
                 .  -LlQz83LXAwr3FWqvmbN: "91"
          ----- .Temperature
                 . -Ll1yS8KchaePZcNypBG: "32"
                 . -Ll1yTmE4GM950mbXN0m: "33"
                 . -Ll1yVSn8vZ82UaPraSw: "36"
                 . -Ll1yX42I9gAWVm2B5yA: "38"

我的html表代码:

(function() {
    var dataHtml = '';
    var tableBody = document.getElementById('tabledata');

    var database = firebase.database();
    var humElement;
    var MoistElement;
    var tempElement;

    var humRef = database.ref('Sensor').child('Humidity');
    var MoistRef = database.ref('Sensor').child('Moisture');
    var tempRef = database.ref('Sensor').child('Temperature');

    humRef.on("value", function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
            var childData1 = childSnapshot.val();
            console.log("humidity: " + childData1);
            humElement = childData1;
        });


        MoistRef.on('value', function(snapshot) {
            snapshot.forEach(function(childSnapshot) {
                var childData2 = childSnapshot.val();
                console.log("Moisture: " + childData2);
                MoistElement = childData2;

            });

            tempRef.on('value', function(snapshot) {
                snapshot.forEach(function(childSnapshot) {
                    var childData3 = childSnapshot.val();
                    console.log("temperature: " + childData3);
                    tempElement = childData3;
                });

                $("#tabledata").append("<tr><td>" + humElement + "</td><td>" + MoistElement +
                    "</td><td>" + tempElement + "</td></tr>");
            });
        });
    });


}());

我的预期结果是:

<table class="content-table" align="center">
<thead>
<tr>
<td >Humidity</td> 
<td >Moisture</td>
<td >Temperature</td>
</tr>
</thead>
<tbody id="tabledata">
</tbody>
</div>

</table>

我已经检索到的东西

             Humidity | Moisture   | Temperature
               64     |     96     |    32
               65     |     95     |    33
               68     |     99     |    36 
               65     |     91     |    38  

我在控制台中得到什么:

      Humidity    | Moisture   | Temperature
         65       |     91     |     38

有人可以告诉我我在做什么错吗?为什么我没有获得最后一个chlid值的所有值instad?有谁能解决这个问题。任何解决方案将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果在向HTML添加数据的行之前添加一条额外的log语句,则问题的原因应该变得更加清楚:

humRef.on("value", function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
        var childData1 = childSnapshot.val();
        console.log("humidity: " + childData1);
        humElement = childData1;
    });


    MoistRef.on('value', function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
            var childData2 = childSnapshot.val();
            console.log("Moisture: " + childData2);
            MoistElement = childData2;

        });

        tempRef.on('value', function(snapshot) {
            snapshot.forEach(function(childSnapshot) {
                var childData3 = childSnapshot.val();
                console.log("temperature: " + childData3);
                tempElement = childData3;
            });

            console.log("Adding "+humElement+", "+MoistElement+", "+tempElement+" to table");
            $("#tabledata").append("<tr><td>" + humElement + "</td><td>" + MoistElement +
                "</td><td>" + tempElement + "</td></tr>");
        });
    });
});

如果运行此命令,控制台将记录:

humidity:64
humidity:65
humidity:68
humidity:65
Moisture:96
Moisture:95
Moisture:99
Moisture:91
temperature:32
temperature:33
temperature:36
temperature:38
Adding 65, 91, 38 to table

这是因为您首先要遍历数据库中的每个快照,然后从每个快照中提取一个值。然后,当您遍历所有快照后,就可以将每个快照的最后一个值添加到HTML中。

由于您具有三个嵌套的读取操作,因此还需要确保对结果数据的循环是嵌套的:

humRef.once("value", function(snapshot) {
  MoistRef.once("value", function(snapshot2) {
    tempRef.once("value", function(snapshot3) {
      snapshot.forEach(function(childSnapshot) {
        humElement = childSnapshot.val();

        snapshot2.forEach(function(childSnapshot2) {
          MoistElement = childSnapshot2.val();

          snapshot3.forEach(function(childSnapshot3) {
            tempElement = childSnapshot3.val();

            $("#tabledata").append("<tr><td>" + humElement + "</td><td>" + MoistElement +
                "</td><td>" + tempElement + "</td></tr>");
            });
          });
        });
      });
    });
  });
});

我创建了此更新的JSBin,以演示如何从每个项目中获取最新值并将其显示在表格中:https://jsbin.com/sujuwik/edit?js,output

var dataHtml = '';
var tableBody = document.getElementById('tabledata');

var database = firebase.database();

var humRef = database.ref('Sensor').child('Humidity');
var moistRef = database.ref('Sensor').child('Moisture');
var tempRef = database.ref('Sensor').child('Tempratue');

humRef.limitToLast(1).once("value", function(snapshot) {
  moistRef.limitToLast(1).once("value", function(snapshot2) {
    tempRef.limitToLast(1).once("value", function(snapshot3) {
      snapshot.forEach(function(childSnapshot) {
        humElement = childSnapshot.val();
        snapshot2.forEach(function(childSnapshot2) {
          MoistElement = childSnapshot2.val();
          snapshot3.forEach(function(childSnapshot3) {
            tempElement = childSnapshot3.val();

            $("#tabledata").append("<tr><td>" + humElement + "</td><td>" + MoistElement +
                "</td><td>" + tempElement + "</td></tr>");
          }); // snapshot3.forEach
        }); // snapshot2.forEach
      }); // snapshot.forEach
    }); // tempRef...once()
  }); // moistRef...once()
}); // humRef...once()

如您所见,它使用limitToLast(1)来确保我们仅从每个传感器获取最新的物品,这使得对齐每个传感器的数据变得容易。

如果要显示多行,则需要弄清楚每个传感器的读数与其他传感器的读数相对应,因为每个传感器上的读数数量不同(1312湿度节点,1305湿度)节点,1314个温度节点)。

例如:您可以还原为使用on(...)而不是once(...),在这种情况下,代码将首先添加具有来自每个传感器的最新值的单行,然后在任何时候添加新行任何传感器报告新值。