Javascript AngularFire 0.82-如何查询非规范化数据?
这个问题与类似,但我确实希望得到一个使用的答案(当前版本为0.82)。 这是我使用的数据结构的一个示例:Javascript AngularFire 0.82-如何查询非规范化数据?,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,这个问题与类似,但我确实希望得到一个使用的答案(当前版本为0.82)。 这是我使用的数据结构的一个示例: { "users": { "user1": { "name": "Alice", "lists": { "list1": "true" } }, "user2": { "name": "Bob", "lists": { "list2": "true" }
{
"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服务”下的代码,它将有所帮助(通常如此)为了理解我们试图解决的用例,而不仅仅是您为问题选择的解决方案——通常有更简单的方法来处理问题集(请参阅)
AngularFire中没有内置任何东西来处理嵌套列表。一个特定元素的列表实际上比从一个列表中引用几个列表要容易得多
Firebase.util
一个名为exists的工具用于帮助反规范化(它目前正在加速到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()
有关更高级的操作以及创建自己的指令或服务,请查看。虽然乍一看可能不太清楚,但这是一个关于如何获取任何Firebase数据并将其转换为任何专有结构的非常透彻的讨论。它会有所帮助(就像往常一样)为了理解我们试图解决的用例,而不仅仅是您为问题选择的解决方案——通常有更简单的方法来处理问题集(请参阅)
AngularFire中没有内置任何东西来处理嵌套列表。一个特定元素的列表实际上比从一个列表中引用几个列表要容易得多
Firebase.util
一个名为exists的工具用于帮助反规范化(它目前正在加速到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()
有关更高级的操作以及创建自己的指令或服务,请查看。虽然乍一看可能不太清楚,但这是一个关于如何获取任何Firebase数据并将其转换为任何专有结构的非常透彻的讨论。它会有所帮助(就像往常一样)为了理解我们试图解决的用例,而不仅仅是您为问题选择的解决方案——通常有更简单的方法来处理问题集(请参阅)
AngularFire中没有内置任何东西来处理嵌套列表。一个特定元素的列表实际上比从一个列表中引用几个列表要容易得多
Firebase.util
一个名为exists的工具用于帮助反规范化(它目前正在加速到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()
有关更高级的操作以及创建自己的指令或服务,请查看。虽然乍一看可能不太清楚,但这是一个关于如何获取任何Firebase数据并将其转换为任何专有结构的非常透彻的讨论。它会有所帮助(就像往常一样)为了理解我们试图解决的用例,而不仅仅是您为问题选择的解决方案——通常有更简单的方法来处理问题集(请参阅)
AngularFire中没有内置任何东西来处理嵌套列表。一个特定元素的列表实际上比从一个列表中引用几个列表要容易得多
Firebase.util
一个名为exists的工具用于帮助反规范化(它目前正在加速到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()
有关更高级的操作以及创建自己的指令或服务,请查看。虽然乍一看可能不太清楚,但这是一个关于如何获取任何Firebase数据并将其转换为任何专有结构的非常透彻的讨论。感谢您提供我可以从中了解到的答案:)关于XY问题,这是有意为之的。我的问题确实是关于具体的解决办法,而不是关于最初的问题。我可以重新安排数据,但我想从中学习如何更好地使用AngularFire编写代码。Firebase.util示例不会检索所有存在的列表吗?这是非常低效的。当您使用交叉点时,它应该只检索第一个列表中的项目。Join将检索所有引用中的所有项。感谢您提供我可以从中学到的答案:)关于XY问题,这是有意的。我的问题确实是关于具体的解决方案,而不是关于最初的pro