Как получить данные объекта из 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>

ключ даст ключ пользователя и пользователь даст значение

Другие вопросы по тегам