firebase获取子节点列表

时间:2015-12-29 15:39:46

标签: javascript angularjs ionic firebase angularfire

我的firebase上有以下结构

"users" : {
"06f0536d-2326-43a0-81db-9e94acc77b4e" : {
  "address" : "xxxxxxxxxxxxx",
  "displayName" : "xxxxxxx",
  "email" : "xxx@xxx.com",
  "fleet" : {
    "-K6iGFIu5Jwu_AmWWDTL" : {
      "avafrom" : 1451343600000,
      "avauntil" : 1454540400000,
      "brands" : "xxxxxxxxxx",
      "desc" : "xxxxxxxxxxxx",
      "dmile" : 5,
      "drate" : 22,
    },
    "-K6iGUY6Y19PExwBklal" : {
      "avafrom" : 1451516400000,
      "avauntil" : 1454540400000,
      "brands" : "xxxxx",
      "desc" : "xxxxxxxxxxxxx",
      "dmile" : 5,
      "drate" : 12,
     }
  },
  "phone" : "+49xxxxxxx",
  "role" : "xxxxxxxxxxx"
},
"22dbc365-3201-4bc0-9f19-2a8a64bea235" : {
  "address" : "xxxxxxxxxxx",
  "displayName" : "xxxx",
  "email" : "xxxx@xxxx.com",
  "fleet" : {
    "-K6ge_Y4enb_a13O1eCu" : {
      "avafrom" : 1451343600000,
      "avauntil" : 1451516400000,
      "brands" : "xxxxxxxxxxx",
      "desc" : "xxxxxxxxxxxxx",
      "dmile" : 1,
      "drate" : 22,
    },
    "-K6gexE9KXd3WGBnjIY8" : {
      "avafrom" : 1451343600000,
      "avauntil" : 1451516400000,
      "brands" : "xxxxxxxxxx",
      "desc" : "xxxxxxxxxxxxxx",
      "dmile" : 1,
      "drate" : 22,
    }
  },
  "phone" : "+49xxxxxx",
  "role" : "xxxxxxx"
},

如何获取所有用户的机队列表?我尝试了以下内容:

var ref = new Firebase(fb+'users');
        return {
            fleet: function(){
                ref.orderByChild("fleet").on("child_added", function(snapshot) {
                    console.log("data trucks", snapshot.val());
                    return snapshot.val();
                })
            }
        }

但我最终获得了所有用户数据,而不仅仅是他们的车队。我甚至不确定我是否做得对,我想在这里建立一对多的关系,每个用户都可以拥有一个包含汽车列表的车队。我是Firebase的新手,英语不是我的母语,所以我真的不懂他们的文档,我想如果有人能给我一个例子来做这件事,那将是一个很大的帮助

任何帮助将不胜感激,提前感谢

1 个答案:

答案 0 :(得分:0)

如果您只想要fleet个节点,则需要重新构建数据。当您从父节点读取数据时,您也将获得所有子节点。

您可以关注uid的{​​{1}},这是一个例子:

fleet

您也无法从异步功能返回。

{
   "users": {
      "06f0536d-2326-43a0-81db-9e94acc77b4e" : {
         "address" : "xxxxxxxxxxxxx",
         "displayName" : "xxxxxxx",
         "email" : "xxx@xxx.com"
      }
   },
   "fleet": {
      "06f0536d-2326-43a0-81db-9e94acc77b4e" : {
         "-K6ge_Y4enb_a13O1eCu" : {
            "avafrom" : 1451343600000,
            "avauntil" : 1451516400000,
            "brands" : "xxxxxxxxxxx",
            "desc" : "xxxxxxxxxxxxx",
            "dmile" : 1,
            "drate" : 22
         }
      }
   }
}

数据必须通过网络下载,因此不会同步发生。

你可以传递一个回调:

ref.orderByChild("fleet").on("child_added", function(snapshot) {
  return snapshot.val(); // won't work
})

但是,它仍然不是你理想的情况。

<强> Use AngularFire, which wraps each Firebase event to a synchronized array.

function FleetFactory() {
  var ref = new Firebase(fb+'users');
  return {
    fleet: function(callback){
      ref.orderByChild("fleet").on("child_added", callback);
    }
  }
}

function MyController(FleetFactory) {
   FleetFactory.fleet(function(snap) {
      console.log(snap.val());
   });
}

请勿尝试angular.module('app', ['firebase']) .constant('FirebaseUrl', '<my-firebase-app>') .service('rootRef', ['FirebaseUrl', Firebase]) .controller('MyCtrl', MyController); function MyController($scope, rootRef, $firebaseArray) { $scope.fleet = $firebaseArray(rootRef.child('fleet')); } ,因为它最初会显示为空,因为数据仍在下载。但是,一旦数据下载,它将触发console.log($scope.fleet)循环,数据将显示在页面上。

尝试在模板中执行$digest过滤器以进行测试:

json