我的网络应用程序使用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,但我不确定如何在这种情况下专门使用它。
答案 0 :(得分:0)
要读取路径中的数据并侦听更改,请使用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>