如何遍历Firebase实例的子项

时间:2014-03-02 23:35:04

标签: angularjs firebase

我想知道如何遍历everyone的孩子。我正在使用Firebase和AngularJS。

我的firebase对象如下:

Firebase Objects

对我而言,它看起来像一本字典,所以从Getting a list of associative array keys我试过

syncData('everyone').$bind($scope, 'everyone').then(function() {
  var keys = $scope.everyone.$getIndex();
  for (var key in $scope.everyone) {
   console.log("key : " + key + " value : " + $scope.everyone[key]);
  }
});

日志确实包含子对象,但它也包含所有方法。像这样

... Before this line is all the other methods.
key : $on value : function (a,c){if("loaded"==a&&b._loaded)return b._timeout(function(){c()}),void 0;if(!b._on.hasOwnProperty(a))throw new Error("Invalid event type "+a+" specified");b._on[a].push(c)} controllers.js:58
key : $off value : function (a,c){if(b._on.hasOwnProperty(a))if(c){var d=b._on[a].indexOf(c);-1!==d&&b._on[a].splice(d,1)}else b._on[a]=[];else b._fRef.off()} controllers.js:58
key : $auth value : function (a){var c=b._q.defer();return b._fRef.auth(a,function(a,b){null!==a?c.reject(a):c.resolve(b)},function(a){c.reject(a)}),c.promise} controllers.js:58
key : $getIndex value : function (){return angular.copy(b._index)} controllers.js:58
key : -JH45WOOAtnZfUZkrJb1 value : [object Object] controllers.js:58
key : -JH45YdfwptGv3y6UqyV value : [object Object] controllers.js:58
key : -JH45_zxptV_dmibyGzL value : [object Object] 

有没有办法可以让孩子们接受?

我之所以这样做是因为我的代码是为使用数组而设计的,但Firebase不鼓励使用数组(对于多人可能更改的值)。所以我试图遍历firebase字典并将对象复制到客户端的数组中。所以我不必改变太多的代码。

3 个答案:

答案 0 :(得分:4)

更新:从AngularFire 0.8.x开始,可以使用$ asArray()来获取记录的排序数组,不再需要这个答案

在angularFire对象中迭代值的正确方法是使用$ getIndex()。你在上面的代码中有这个,但没有在for循环中使用它。

由于您已经在使用angularFire lib(syncData是使用angularFire的angularFire-seed服务),因此无需担心调用$ apply()或其他任何哄骗数据的复杂性在上一个答案中详细介绍了Angular(这对于原始的Firebase / Angular实现是一个很好的响应)。

相反,只需更改for循环以迭代键而不是angularFire实例:

syncData('everyone').$bind($scope, 'everyone').then(function() {
  var keys = $scope.everyone.$getIndex();

  // utilizing Angular's helpers
  angular.forEach(keys, function(key) {
     console.log(key, $scope.everyone[key]);
  });

  // or as a for loop
  for(var i=0, len = keys.length; i < len; i++) {
     console.log(keys[i], $scope.everyone[keys[i]]);
  }
});

要使用DOM中的对象,请使用ng-repeat

<ul>
  <li ng-repeat="(key,user) in everyone">{{key}}, {{user|json}}</li>
</ul>

答案 1 :(得分:0)

我这样做的方式非常简单,只需将所有孩子按到这样的方式将其推送到阵列中。

Everyone.on('child_added', function(snap) {
  implementLogic(snap.val());
  $scope.$apply();
});

function implementLogic(person) {
  $scope.everyone.push(person);

  if (something) {
    $scope.todaysPeople.push(person);
  }
  if (something else) {
    $scope.peopleToTest.push(person);
  }
  ...
}

这将为您提供所需的子对象数组。

答案 2 :(得分:0)

像这样使用ng-fire-alarm with collection: true

angular.module('demo', ['ng-fire-alarm']).controller('IndexCtrl', IndexCtrl);

function IndexCtrl ($scope) {
  var everyone = new Firebase(URL).child('everyone');
  everyone
  .$toAlarm({collection: true}) // will transform object into native array
  .$thenNotify(function(everyones){ // notify you on ANY changes 
    $scope.everyones = everyones;
  });
}