Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何从Firebase';键';:';正确';帕特恩_Angularjs_Firebase_Angularfire - Fatal编程技术网

Angularjs 如何从Firebase';键';:';正确';帕特恩

Angularjs 如何从Firebase';键';:';正确';帕特恩,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我有以下firebase数据: { "userData": { "user01": { "name": "User One" "provider": "provider0001" }, "user02": { "name": "User Two" "provider": "provider0001" }, "user03": {

我有以下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}}
为什么我不能将
{{user}}
列为对象?上面将显示true的列表,但如何访问用户对象本身?

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

键将给出用户的键,用户将给出值
  • {{key}}:{{user}
  • 键将给出用户的键,用户将给出值

    您需要将
    用户
    -对象中的键(您的用户ID)映射到
    用户数据
    -对象中的值。您可以在
    ng repeat
    -指令中获得如下键:

    ng-repeat="(key, value) in $ctrl.provider.users"
    
    <ul>
        <li ng-repeat="(key, value) in $ctrl.provider.users" 
            ng-init="user = $ctrl.userData[key]">
            {{user}}
        </li>
    </ul>
    
    然后在控制器中,需要将userData对象添加到控制器作用域:

    vm.userData = $firebaseObject(ref.child('userdata'));
    
    因此,您可以像这样实现ng repeat:

    ng-repeat="(key, value) in $ctrl.provider.users"
    
    <ul>
        <li ng-repeat="(key, value) in $ctrl.provider.users" 
            ng-init="user = $ctrl.userData[key]">
            {{user}}
        </li>
    </ul>
    
    然后,您可以在这个新的
    vm.users
    -array上使用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的熟悉程度非常有限,因此可能有更好的解决方案

    您需要将
    用户
    -对象中的键(您的用户ID)映射到
    用户数据
    -对象中的值。您可以在
    ng repeat
    -指令中获得如下键:

    ng-repeat="(key, value) in $ctrl.provider.users"
    
    <ul>
        <li ng-repeat="(key, value) in $ctrl.provider.users" 
            ng-init="user = $ctrl.userData[key]">
            {{user}}
        </li>
    </ul>
    
    然后在控制器中,需要将userData对象添加到控制器作用域:

    vm.userData = $firebaseObject(ref.child('userdata'));
    
    因此,您可以像这样实现ng repeat:

    ng-repeat="(key, value) in $ctrl.provider.users"
    
    <ul>
        <li ng-repeat="(key, value) in $ctrl.provider.users" 
            ng-init="user = $ctrl.userData[key]">
            {{user}}
        </li>
    </ul>
    
    然后,您可以在这个新的
    vm.users
    -array上使用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的熟悉程度非常有限,因此可能会有更好的解决方案

    如果你制作了json对象数组,那么你就可以使用ng repeat并显示记录。你需要在客户端为每个用户获取数据。看见这并不像你担心的那么慢。请看,您已经创建了json对象数组,然后您可以使用ng repeat和display记录。您需要执行客户端操作来获取每个用户的数据。看见这并不像你担心的那么慢。看看,但是什么id userdata有1000多条记录,加载所有这些数据真的是必要的吗?不应该,但是你需要使用firebase来进行映射/过滤。我将试着编一个例子。@vidriduch我已经用一个解决方案更新了我的答案,该解决方案不会一次加载所有的
    userData
    。相反,它分别加载每个用户的数据。我不能说这是否更高性能,但Firebase应该使用管道,因此所有查询都将并行执行。但是什么id userdata有1000多条记录,真的需要加载所有这些数据?不应该,但您需要使用Firebase进行映射/过滤。我将试着编一个例子。@vidriduch我已经用一个解决方案更新了我的答案,该解决方案不会一次加载所有的
    userData
    。相反,它分别加载每个用户的数据。我不能说这是否更有效,但Firebase应该使用管道,所以所有查询都将并行执行。