这个问题类似于AngularFire - How do I query denormalised data?,但是我确实希望得到使用AngularFire的答案(当前版本为0.82)。
这是我使用的数据结构的一个示例:
{
"users": {
"user1": {
"name": "Alice",
"lists": {
"list1": "true"
}
},
"user2": {
"name": "Bob",
"lists": {
"list2": "true"
}
}
},
"lists": {
"list1": {
"title": "Example"
},
"list2": {
"title": "Example2"
}
}
}
或者,用另一种表示法:
为了获得一个用户的所有列表,我们需要所有这些:
users/$userID/lists/$listID
列表的内容存储在以下位置:
lists/$listID
我想要实现的是能够访问特定用户列表的内容,而无需“手动”遍历每个$ ListID。
更好的答案可以包括将访问权包装在AngularFire扩展服务中的代码,类似于AngularFire docs中“创建AngularFire服务”下的代码。
最佳答案
这将有助于(一如既往地)理解我们试图解决的用例,而不只是了解您为问题选择的解决方案-通常有更简单的方法来解决问题集(请参见What is the XY problem?) 。
AngularFire内置没有任何东西可以处理列表的嵌套列表。实际上,一个特定元素的列表比一个列表中引用的几个列表要容易得多。
Firebase.util
存在一个名为Firebase.util的工具来帮助进行非规范化(目前正被升级到V2,由于需要一两个月的时间),并且它与AngularFire兼容:
var fbRef = new Firebase(URL);
var indexRef = fbRef.child('users/' + userId + '/lists');
var dataRef = fbRef.child('lists');
var joinedRef = Firebase.util.intersection(indexRef, dataRef);
var lists = $firebase( joinedRef ).$asArray();
仅角度
仅限角度的方法是手动加载列表并将AngularFire用于单个列表:
app.factory('NestedList', function($firebase, $timeout) {
return function(indexRef, dataRef) {
var hashOfLists = {};
indexRef.on('child_added', function(snap) {
var key = snap.key();
var list = $firebase( dataRef.child(key).$asArray();
hashOfLists[key] = list;
});
indexRef.on('child_removed', function(snap) {
$timeout(function() {
delete hashOfLists[snap.key()];
});
});
return hashOfLists;
}
});
请注意,此示例使用snap.key(),但仅在使用本周刚发布的SDK版本2.x时适用。先前版本应使用snap.name()
要进行更高级的操作并创建自己的指令或服务,请查看question and answer here。尽管乍看之下可能看不到,但这是关于如何获取任何Firebase数据并将其转换为任何专有结构的相当详尽的讨论。
关于javascript - AngularFire 0.82-如何查询非规范化数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26810835/