我是Angular - Firebase开发的新手,我在理解如何检索嵌套在两个集合中的数据方面遇到了问题。 我有一个名为" Orders"的集合,其中包括一个字段调用" auth",这是用户ID,我有另一个集合,即#34; User Profile&#34 ;它的$ id是" auth"的价值。在用户配置文件中,我有一个名为roomNumber的字段,它是我想要在每次阅读时检索的内容,在订单的ng-repeat中。
在我看来,我试图做这样的事情:
<tr ng-repeat="item in items | filter: searchKeyword ">
<td align="left">{{item.$id}} - {{roomNumber(item.$id)}}</td></tr>
roomNumber是我的控制器中的一个函数
$scope.roomNumber = function(id) {
var rootRef = new Firebase("https://xxxx-fire-yyyy.firebaseio.com/userProfile"+ '/' + id);
$scope.userdet = $firebaseArray(rootRef);
rootRef.on("value", function(rootSnapshot) {
var key = rootSnapshot.key();
var childKey = rootSnapshot.child("room").val();
console.log("room ", childKey)
});
return childKey
}
当我运行此代码并在我的js控制台中查看结果时,会发生奇怪的事情: 它重复了很多次 2.我永远无法获得childKey值
我一直在阅读Firebase文档,但我真的不明白如何做到这一点&#34;愚蠢&#34;什么,有人给我一个如何做的提示吗?
答案 0 :(得分:1)
当你将一个函数绑定到$ scope并在html中调用它时,它希望在调用时立即得到一个答案。因此,当你查询firebase并花费很多时间让你回答时,angularjs已经从函数中获得了未定义的答案。
所以发生的事情是你在向rootRef.on提供函数时注册回调,然后在你注册回调后立即返回childKey的值。不幸的是,childKey只能由回调函数设置(firebase尚未执行)。因此,angularjs从您的roomNumber函数中获得未定义的答案。
为了完成这项工作,您必须事先获得房间号,然后将它们添加到$ scope.items中的每个项目中,然后使用
<td align="left">{{item.$id}} - {{item.room}}</td></tr>
而不是
<td align="left">{{item.$id}} - {{roomNumber(item.$id)}}</td></tr>
要加载所有房间号码,您可以在$ scope.items加载
之后调用类似这样的函数for (var i = 0; i < $scope.items.length; i++) {
var rootRef = new Firebase("https://xxxx-fire-yyyy.firebaseio.com/userProfile"+ '/' + $scope.items[i].$id);
$scope.userdet = $firebaseArray(rootRef);
rootRef.on("value", function(rootSnapshot) {
var key = rootSnapshot.key();
var childKey = rootSnapshot.val().room;
$scope.items[i].room = childKey;
});
}
它会更改每个项目以引用房间。不幸的是,该列表不会随着数据更新而更新,因此更好的解决方案是在从服务器获取项目的任何功能中执行相同的查询,并在将项目添加到项目列表时将空间添加到每个项目
答案 1 :(得分:0)
要修复childKey无法读取的问题,您需要使用:
var childKey = rootSnapshot.val().room;
而不是:
var childKey = rootSnapshot.child("room").val();
console.log("room ", childKey)
参考:https://www.firebase.com/docs/web/guide/retrieving-data.html