Firebase on(child_added)某个字段' undefined'

时间:2015-01-11 19:46:22

标签: firebase

我正在开发一个实时应用程序,我正在使用带有纯HTML和javascript(不是angularJS)的firebase。

我遇到一个问题,我用Firebase的给定代码将用户的数据保存到firebase:

var isNewUser = true;
ref.onAuth(function(authData) {
  if (authData && isNewUser) {
    authData['status'] = 'active';
    authData['role'] = 'member';
    ref.child("users").child(authData.uid).set(authData);
   }
});

这会将authData添加到/users/节点。如您所见,我还将一些自定义字段附加到authData,status和role。

现在我正在使用此代码从firebase获取用户的数据并显示它们。

ref4.on("value", function(snapshot) {
    var snapshotData = snapshot.val();
console.log('username: '+snapshotData.status);
});

如果我使用on('value'),状态会在控制台上打印出来,但如果我这样做,

ref4.on("child_added", function(snapshot) {
  var snapshotData = snapshot.val();
  console.log('status: '+snapshotData.status);
});

显示状态未定义。我可以知道什么是错的以及如何解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:1)

由于value返回ref4提供的路径,而child_added正在返回该路径的每个子节点,因此两者都不可能具有密钥状态。

考虑这个数据结构:

{
   "users": {
      "brucelee": {
          "status": "awesome"
      },
      "chucknorris": {
          "status": "awesomerest"
      }
   }
}

如果我现在根据你不完整的例子来查询:

var ref = new Firebase('https://<instance>firebaseio.com/users/brucelee');
ref.on('value', function(snap) {
   // requests the brucelee record
   console.log(snap.name(), ':', snap.val().status); // "brucelee: awesome"
});

ref.on('child_added', function(snap) {
   // iterates children of the brucelee path (i.e. status)
   console.log(snap.name(), ':', snap.val().status); // THROWS AN ERROR, because status is a string
});

所以要在child_added上使用这样的数据结构(可能有点像你的)这样做,它看起来如下:

ref.on('child_added', function(snap) {
   // iterates children of the brucelee path (i.e. status)
   console.log(snap.name(), ':', snap.val()); // "status: awesome"
});