如何获取每个对象的密钥?

时间:2017-07-04 07:43:54

标签: javascript jquery firebase firebase-realtime-database

我有一个firebase数据库包含一个json数据,我将它追加到cardViews中,我想在点击时获取cardView的键,而是返回数据库中所有对象的数组 这是我的index.js:

var rootRef = firebase.database().ref().child("Stories");
rootRef.on("child_added", snap => {
  var title = snap.child("Story Title").val();
  var content = snap.child("Story Content").val();
  $("#stories").append("<div  id=\"cold\" class=\"col s8 m6\"><div 
    class=\"card\"><div class=\"card-image\"><img 
    src=\"https://www.joshmorony.com/wp-content/uploads/2016/11/firebase.png\">
    <a  class=\"btn-floating halfway-fab waves-effect waves-light red\"><i   
    class=\"material-icons\">info</i></a></div><div class=\"card-content\"><p 
    onclick=\"viewKey()\">" + title + "</p></div></div></div>");
  });

  function viewKey() {
    firebase.database().ref('/Stories/').once('value').then(function(snapshot) {
      var storiesArray = snapshot.val();
      var keys = Object.keys(storiesArray);
      for (var i = 0; i < keys.length; i++) {
        var currentStory = storiesArray[keys[i]];
       console.log(currentStory);
      }

    });
  }

对象数组: [“-Ko8JpEjsdN2KGBdIG3f”,“ - Ko8JtdcEBICVZqIXLdO”,“ - Ko8TvZuu0Wh_XDGa1YW”,“ - KoBR0NmVmerjomE63-V”,“ - KoBSOybd5ymvOwz0Ip6”]

1 个答案:

答案 0 :(得分:1)

我认为这可能就是答案:快照有一把钥匙。

由于您使用的是child_added,因此每次只读一个子进程,因此每个子snap.key将为您提供该子快照的密钥。换句话说,child_added行之后的闭包内的代码将为Stories节点中的每个子节点运行一次。

如果您要使用值,则会在一个“大”快照(一个包含多个子节点的父节点)中读取Stories节点中的所有数据。所以它看起来像

Stories
  story_0
    story_info: "ads"
  story_1
    story_info: "assad"

在这种情况下,您需要遍历Stories快照以获取每个孩子(story_0,story_1等)。每个孩子都有它自己的快照,它有自己的snapshot.key。

请参阅Work with Lists of Data on the Web

使用child_added:

时,此代码将输出每个故事的密钥
var storiesRef = firebase.database().ref().child("Stories");
storiesRef.on('child_added', function(snap) {
  console.log(snap.key);
});

如果你想使用值一次获取所有故事,这将在Stories节点中读取并迭代子节点,输出每个键

storiesRef.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    console.log(childSnapshot.key);
  });
});

请注意,上面的child_added函数将获取每个子节点并继续侦听child_added事件,而上面的值函数将执行一次而不会侦听将来的事件。