在 Firebase 的 angularFire 数组中获取嵌套对象长度
get nested object length in an angularFire array in Firebase
我有一个这样的 Firebase 结构:
user {
uid {
Lessons {
lid1 {
Title: ...
}
lid2 {
Title: ...
}
}
}
}
我想使用 AngularFire 将用户转换为数组,这样我就可以像这样使用 Angular 过滤它们:
var usersRef = new Firebase($rootScope.baseUrl + "users");
var userListfb = $firebase(usersRef).$asArray();
问题是,我还需要 Lessons 对象的子对象的数量。当我登录 userListfb 时,它是一个数组。但在数组内部,Lessons 节点仍然是一个对象。我不能使用 length 来获取它的长度。使用 Firebase AngularFire 找出课程节点的子节点数量的正确方法是什么?
编辑 1
根据 Frank 的解决方案,我得到了一个无限循环(digest circle error from AngularJS)。
问题是,我不知道 "uid" 键。我需要在第一个数组中循环它以将 uid 放入第二个 firebaseArray。
假设我在视图中有一个 ng-repeat="user in users" 并在每次重复中在视图级别调用它:
{{getLessonLength(user.uid)}}
然后在控制器中,我有这个功能:
$scope.users = $firebaseArray($scope.usersRef);
$scope.getLessonLength = function (uid) {
var userRef = $rootScope.baseUrl + "users/" + uid + "/lessons/";
var lessonsNode = $firebaseArray(new Firebase(userRef));
return lessonsNode.length;
}
}
它抛出这个错误:错误:[$rootScope:infdig] 10 $digest() iterations reached。中止!
观察者在最后 5 次迭代中解雇:[]
我想要的只是常规 Firebase 中的 var lessonsCount = snapshot.child('lessons').numChildren() .on('child_added' ...), numChildren( ) FirebaseArray 中的函数。请帮忙!
AngularFire 包含相当多的代码来确保 Firebase 中的 有序集合 正确映射到 JavaScript 数组,如 Angular (和你)期待它。
如果您有对特定用户的引用,您只需创建一个新同步 ($firebase
) 并在其上调用 $asArray
。
var usersRef = new Firebase($rootScope.baseUrl + "users");
var userListfb = $firebase(usersRef).$asArray();
var uid1LessonsRef = userRef.child('uid1').child('Lessons');
var uid1LessonsArray = $firebase(uid1LessonsRef).$asArray();
uid1LessonsArray.$loaded().then(function(arr) {
console.log('Loaded lessons, count: '+arr.length);
});
无论您创建了多少引用,数据都只会同步一次。
我有一个这样的 Firebase 结构:
user {
uid {
Lessons {
lid1 {
Title: ...
}
lid2 {
Title: ...
}
}
}
}
我想使用 AngularFire 将用户转换为数组,这样我就可以像这样使用 Angular 过滤它们:
var usersRef = new Firebase($rootScope.baseUrl + "users");
var userListfb = $firebase(usersRef).$asArray();
问题是,我还需要 Lessons 对象的子对象的数量。当我登录 userListfb 时,它是一个数组。但在数组内部,Lessons 节点仍然是一个对象。我不能使用 length 来获取它的长度。使用 Firebase AngularFire 找出课程节点的子节点数量的正确方法是什么?
编辑 1 根据 Frank 的解决方案,我得到了一个无限循环(digest circle error from AngularJS)。 问题是,我不知道 "uid" 键。我需要在第一个数组中循环它以将 uid 放入第二个 firebaseArray。 假设我在视图中有一个 ng-repeat="user in users" 并在每次重复中在视图级别调用它:
{{getLessonLength(user.uid)}}
然后在控制器中,我有这个功能:
$scope.users = $firebaseArray($scope.usersRef);
$scope.getLessonLength = function (uid) {
var userRef = $rootScope.baseUrl + "users/" + uid + "/lessons/";
var lessonsNode = $firebaseArray(new Firebase(userRef));
return lessonsNode.length;
}
}
它抛出这个错误:错误:[$rootScope:infdig] 10 $digest() iterations reached。中止! 观察者在最后 5 次迭代中解雇:[]
我想要的只是常规 Firebase 中的 var lessonsCount = snapshot.child('lessons').numChildren() .on('child_added' ...), numChildren( ) FirebaseArray 中的函数。请帮忙!
AngularFire 包含相当多的代码来确保 Firebase 中的 有序集合 正确映射到 JavaScript 数组,如 Angular (和你)期待它。
如果您有对特定用户的引用,您只需创建一个新同步 ($firebase
) 并在其上调用 $asArray
。
var usersRef = new Firebase($rootScope.baseUrl + "users");
var userListfb = $firebase(usersRef).$asArray();
var uid1LessonsRef = userRef.child('uid1').child('Lessons');
var uid1LessonsArray = $firebase(uid1LessonsRef).$asArray();
uid1LessonsArray.$loaded().then(function(arr) {
console.log('Loaded lessons, count: '+arr.length);
});
无论您创建了多少引用,数据都只会同步一次。