使用Angular如何从Firebase中筛选获取指定关联的列表数据
实现步骤
默认你已经在项目中接入了AngularJS以及AngularFire(Firebase官方AngularJS适配库,用于操作Firebase实时数据库),逻辑分为两步即可实现需求:
- 第一步:查询
Branch B下branchB2节点的所有子数据,提取出所有关联的Branch A的ID值 - 第二步:根据提取到的ID列表,逐个查询
Branch A下的对应节点,汇总结果即可
代码示例
// AngularJS 控制器示例 app.controller('FirebaseQueryCtrl', ['$scope', '$firebaseObject', '$q', function($scope, $firebaseObject, $q) { // 初始化Firebase实时数据库引用 const dbRef = firebase.database().ref(); // 用户选中的Branch B节点ID const selectedBranchBId = 'branchB2'; // 1. 拉取branchB2节点下的所有关联ID const branchB2Ref = dbRef.child('Branch B').child(selectedBranchBId); $firebaseObject(branchB2Ref).$loaded().then(branchB2Data => { // 提取所有Id字段,过滤掉AngularFire自动注入的$开头内置属性 const relatedAIds = Object.values(branchB2Data) .filter(item => typeof item === 'object' && item.Id) .map(item => item.Id); // 最终得到['branchA3', 'branchA4'] // 2. 批量查询Branch A下对应ID的节点数据 const queryPromises = relatedAIds.map(aid => { return $firebaseObject(dbRef.child('Branch A').child(aid)).$loaded(); }); // 等待所有异步查询完成,得到最终结果 $q.all(queryPromises).then(targetResult => { // targetResult就是你需要的branchA3、branchA4两条完整数据 $scope.targetData = targetResult; console.log($scope.targetData); }); }); }]);
如果你没有使用AngularFire,直接用原生Firebase SDK的话逻辑完全一致,只需要把
$firebaseObject和$loaded的写法替换成原生的once('value')回调/Promise写法即可,不需要调整查询逻辑。
内容的提问来源于stack exchange,提问作者Abbas Tambawala
相关产品推荐
相关产品推荐

