如何从 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 的了解非常有限,因此可能有更好的解决方案