如何从Firebase获取对象数据' key':' true'百通

时间:2017-03-14 12:07:52

标签: angularjs firebase angularfire

我有这个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的列表,但是如何自己访问用户对象?

2 个答案:

答案 0 :(得分:3)

您需要将users - 对象中的键(您的userId)映射到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]);
    });
}

然后你可以在这个新的vm.users - 数组上使用ng-repeat进行迭代。

更新

这是一个只检索实际映射用户的解决方案。它为每个用户进行查询,因为我找不到一种方法,只需使用一个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的熟悉程度非常有限,因此可能有更好的解决方案

答案 1 :(得分:1)

<ul>
  <li ng-repeat="(key,user) in $ctrl.provider.users">
   {{key}}:{{user}}
  </li>

键将给出用户的密钥,用户将给出值