Как получить данные объекта из Firebase 'key':'true' patern
У меня есть эти данные базы:
{
"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}}
как объект? Выше будет отображаться список истинных, но как я могу получить доступ к объекту пользователя сам?
2 ответа
Вам необходимо сопоставить ключи (ваши userId's) в users
-объект, к ценностям в вашем 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
-array.
Обновить
Вот решение, в котором вы извлекаете только реальных сопоставленных пользователей. Это делает запрос для каждого пользователя, так как я не смог найти достойный способ объединить две коллекции по ключу, используя только один запрос 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 очень ограничено, поэтому могут быть лучшие решения там
<ul>
<li ng-repeat="(key,user) in $ctrl.provider.users">
{{key}}:{{user}}
</li>
ключ даст ключ пользователя и пользователь даст значение