如何从 Firebase 'key':'true' 模式获取对象数据
How to get a data of object from Firebase 'key':'true' patern
我有这个 Firebase 数据:
{
"userData": {
"user01": {
"name": "User One"
"provider": "provider0001"
},
"user02": {
"name": "User Two"
"provider": "provider0001"
},
"user03": {
"name": "User Three"
"provider": "provider0002"
}
},
"provider": {
"provider0001": {
"users": {
"user01": true,
"user02": true
}
},
"provider0002": {
"users": {
"user03": true
}
}
}
}
控制器
vm.provider = $firebaseObject(ref.child('provider').child('provider0001'));
简单html
<ul>
<li ng-repeat="user in $ctrl.provider.users">
{{user}}
</li>
</ul>
为什么我不能将 {{user}}
列为对象?以上将显示 true 的列表,但我如何访问它自己的用户对象?
<ul>
<li ng-repeat="(key,user) in $ctrl.provider.users">
{{key}}:{{user}}
</li>
key会给出用户的key,用户会给出value
您需要将 users
对象中的键(您的用户 ID)映射到 userData
对象中的值。您可以像这样在 ng-repeat
指令中获取密钥:
ng-repeat="(key, value) in $ctrl.provider.users"
然后在您的控制器中,您需要将 userData 对象添加到您的控制器范围:
vm.userData = $firebaseObject(ref.child('userdata'));
所以你可以像这样实现你的 ng-repeat:
<ul>
<li ng-repeat="(key, value) in $ctrl.provider.users"
ng-init="user = $ctrl.userData[key]">
{{user}}
</li>
</ul>
话虽如此,您最初在控制器中检索数据时可能应该执行此映射。像这样:
function loadData(){
var providerUsers = $firebaseObject(ref.child('provider').child('provider0001').child('users'));
var userData = $firebaseObject(ref.child('userData'));
vm.users = [];
angular.forEach(providerUsers, function(value, key) {
vm.users.push(userData[key]);
});
}
然后你可以使用 ng-repeat 迭代这个新的 vm.users
-数组。
更新
这是一个只检索实际映射用户的解决方案。它为每个用户进行查询,因为我无法找到一种合适的方法来仅使用一个 Firebase 查询来按键连接两个集合。
function loadData(){
var userRef = ref.child('provider').child('provider0001').child('users');
var userDataRef = ref.child('userData');
vm.users = [];
userRef.once('value', function(snapshot){
snapshot.forEach(function(userId){
userDataRef.child(userId.key()).once("value", function(user){
$scope.$apply(function () {
vm.users.push(user.val());
});
});
})
});
}
我对 Firebase 的了解非常有限,因此可能有更好的解决方案
我有这个 Firebase 数据:
{
"userData": {
"user01": {
"name": "User One"
"provider": "provider0001"
},
"user02": {
"name": "User Two"
"provider": "provider0001"
},
"user03": {
"name": "User Three"
"provider": "provider0002"
}
},
"provider": {
"provider0001": {
"users": {
"user01": true,
"user02": true
}
},
"provider0002": {
"users": {
"user03": true
}
}
}
}
控制器
vm.provider = $firebaseObject(ref.child('provider').child('provider0001'));
简单html
<ul>
<li ng-repeat="user in $ctrl.provider.users">
{{user}}
</li>
</ul>
为什么我不能将 {{user}}
列为对象?以上将显示 true 的列表,但我如何访问它自己的用户对象?
<ul>
<li ng-repeat="(key,user) in $ctrl.provider.users">
{{key}}:{{user}}
</li>
key会给出用户的key,用户会给出value
您需要将 users
对象中的键(您的用户 ID)映射到 userData
对象中的值。您可以像这样在 ng-repeat
指令中获取密钥:
ng-repeat="(key, value) in $ctrl.provider.users"
然后在您的控制器中,您需要将 userData 对象添加到您的控制器范围:
vm.userData = $firebaseObject(ref.child('userdata'));
所以你可以像这样实现你的 ng-repeat:
<ul>
<li ng-repeat="(key, value) in $ctrl.provider.users"
ng-init="user = $ctrl.userData[key]">
{{user}}
</li>
</ul>
话虽如此,您最初在控制器中检索数据时可能应该执行此映射。像这样:
function loadData(){
var providerUsers = $firebaseObject(ref.child('provider').child('provider0001').child('users'));
var userData = $firebaseObject(ref.child('userData'));
vm.users = [];
angular.forEach(providerUsers, function(value, key) {
vm.users.push(userData[key]);
});
}
然后你可以使用 ng-repeat 迭代这个新的 vm.users
-数组。
更新
这是一个只检索实际映射用户的解决方案。它为每个用户进行查询,因为我无法找到一种合适的方法来仅使用一个 Firebase 查询来按键连接两个集合。
function loadData(){
var userRef = ref.child('provider').child('provider0001').child('users');
var userDataRef = ref.child('userData');
vm.users = [];
userRef.once('value', function(snapshot){
snapshot.forEach(function(userId){
userDataRef.child(userId.key()).once("value", function(user){
$scope.$apply(function () {
vm.users.push(user.val());
});
});
})
});
}
我对 Firebase 的了解非常有限,因此可能有更好的解决方案