从多个节点检索数据时,AngularFire '10 $ digest()迭代达到'错误'

时间:2017-07-09 23:55:56

标签: angularjs firebase firebase-realtime-database angularfire

我的网络应用程序使用Firebase JS和AngularJS显示事件注册列表以及为每个事件注册的用户。事件和用户数据位于不同的数据库节点中。

数据库:

"event_registrations" : {
    "$event_id" : {
        "$user_id" : {
           "registration_date" : "..." 
           "total_amount" : "...",
        }
    }
},

"users" : {
    "$user_id" : {
      "events" : {
        "event_id" : 1
      },
      "profile" : {
        "email" : "..."
        "name" : "...",
        // ...
      }
    },
}

角:

function MyController($scope, $firebaseObject) {
    // Retrieve event data
    $scope.events = scope.firebaseRef.child('event_registrations');

    // Retrieve user_data
    $scope.getUserData = function(userID) {
        var ref = $firebaseObject(scope.firebaseRef
           .child('users')
           .child(userID)
           .child('profile'));

        ref.$ref().once("value", function(dataSnapshot) {
            var data = dataSnapshot.val();
            $scope.user_data = data;
        });
    };
 }

网页:

 <div ng-repeat="event in event_registrations">
    <table>
        <tr>
            <tr ng-repeat="(user_id, user_data) in event">
                {{getUserData(user_id)}}

                <td>{{user_data.email}}</td>
                <td>{{user_data.name}}</td>
            </tr>
        </tbody>
    </table>
</div>

问题是,当从网页调用getUserData()时,会产生10 $digest() iterations reached错误,并且当在Firebase数据库中更新时,网页上的数据会实时停止更新。 / p>

如何解决这个问题?我看过Firebase-Util,但我不确定如何在这种情况下专门使用它。

2 个答案:

答案 0 :(得分:0)

来自Firebase Docs

要读取路径中的数据并侦听更改,请使用on()的{​​{1}}或once()方法观察事件。

要实时更新,您应该使用firebase.database.Reference方法。连接侦听器时会触发此方法,每次包括子项在内的数据发生更改时,都会触发此方法。

在你的情况下,

on()

答案 1 :(得分:0)

通过简单地在getUserData()中返回Firebase数据库引用来修复:

 $scope.getUserData = function(userID) {
    var ref = $firebaseObject(scope.firebaseRef
        .child('users')
        .child(userID)
        .child('profile'));

    return ref;
};

然后在ng-repeat`元素的getUserData()中调用ng-init

<tr ng-repeat="(user_id, user_data) in event" ng-init="user_data=getUserData(user_id)>
      <td>{{user_data.email}}</td>
      <td>{{user_data.name}}</td>
</tr>