Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何循环Firebase实例的子级_Angularjs_Firebase - Fatal编程技术网

Angularjs 如何循环Firebase实例的子级

Angularjs 如何循环Firebase实例的子级,angularjs,firebase,Angularjs,Firebase,我想知道如何循环遍历每个人的孩子。我用的是Firebase和AngularJS 我的firebase对象看起来像: 对我来说,它就像一本字典,所以我已经试过了 syncData('everyone').$bind($scope, 'everyone').then(function() { var keys = $scope.everyone.$getIndex(); for (var key in $scope.everyone) { console.log("key : " +

我想知道如何循环遍历
每个人的孩子。我用的是Firebase和AngularJS

我的firebase对象看起来像:

对我来说,它就像一本字典,所以我已经试过了

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字典,并将对象复制到客户端的数组中。因此,我不必对代码做太多更改。

我这样做的方式非常简单,只要将所有的子项按如下方式放入一个数组中即可

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);
  }
  ...
}

这就给您留下了所需的子对象数组。

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

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

由于您已经在使用(syncData是使用angularFire的服务),因此无需担心调用$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]]);
  }
});
syncData('everyone')。$bind('scope,'everyone')。然后(function(){
var keys=$scope.everyone.$getIndex();
//利用Angular的助手
角度。forEach(键,函数(键){
log(key$scope.everyone[key]);
});
//或者作为for循环
for(变量i=0,len=keys.length;i
要使用DOM中的对象,请使用:

  • {{{key}},{{{user}json}
像这样使用:

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;
  });
}

我确实在文件里看到了。但我无法计算出1。我如何知道它什么时候完成?2.我如何开始我剩下的逻辑?现在我有一个.then()方法,在我的sync之后(我更新了这个问题来说明这一点),如果(!$scope.$$phase)这样做了,你需要实现什么样的逻辑?$apply调用告诉DOM更新,因为firebase套接字在摘要之外。然后,现有逻辑将遍历“everyone”数组,并从中创建更多数组,如“todaysPeople”、“peopleToTest”等。因此,“everyone”数组需要在代码使用它之前包含所有人。如果有意义的话?作为旁白,告诉我不要使用If(!$scope.$$phase)$scope.$apply()@Lango非常正确,您不想到处调用它,这是一个异步事件,因此无论如何都不应该处于$$阶段,但这是一个很好的检查。就逻辑而言,你能把它放在这里吗?我编辑了答案作为例子谢谢。这正是我想要的。你说有但没有使用$getIndex()是对的,我不确定我怎么会错过它。我想你的for循环中有一个输入错误。我认为应该是for(var I=0;I
谢谢!实际上,它应该是
var i=0,len=keys.length;i
,由于作用域和查找的工作方式,在某些浏览器中速度要快得多。$asArray返回的对象在迭代时仍然包含额外的三个子对象。我自己尝试解决这个问题。@obie不要使用(key,user)用数组表示;这仅适用于对象。
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;
  });
}