我想知道如何遍历everyone
的孩子。我正在使用Firebase和AngularJS。
我的firebase对象如下:
对我而言,它看起来像一本字典,所以从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字典并将对象复制到客户端的数组中。所以我不必改变太多的代码。
答案 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;
});
}