Angularjs 如何从Firebase';键';:';正确';帕特恩
我有以下firebase数据:Angularjs 如何从Firebase';键';:';正确';帕特恩,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我有以下firebase数据: { "userData": { "user01": { "name": "User One" "provider": "provider0001" }, "user02": { "name": "User Two" "provider": "provider0001" }, "user03": {
{
"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}
键将给出用户的键,用户将给出值
用户
-对象中的键(您的用户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应该使用管道,所以所有查询都将并行执行。