【发布时间】:2017-03-03 01:27:19
【问题描述】:
我获得了存储在 Firebase 数据库中名为 users 的当前用户数据下的“项目”字段中的值:
第一种方法:
var promise = MyUser.user();
promise.then( function onSuccess(user) {
$scope.userprojectskeys = user.projects;
});
第二种方法:
var keyquery = DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("savedprojects").forEach(function(childSnapshot) {
var userprojects = childSnapshot.val();
console.log("my list is :", userprojects );
});
});
第一种方法的$scope.userprojectskeys和第二种方法的userprojects都返回所需的数据:
第一种方法输出:
@ 987654321@
第二种方法输出:
my list is : -KUTLAZENGlxtzCtEfaZ
my list is : -KUTLM8r_kmVSTaxzLW5
my list is : -KUTPrs6ARZXjbjtNr7O
另一方面,我有另一个函数可以获取另一个名为 projects 的数据库下的子列表,如下所示:
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo("-KUTPrs6ARZXjbjtNr7O");
$scope.projectslist = $firebaseArray(projectquery);
我现在正在做的是 ng-repeating $scope.projectslist 中对象的字段,显示每个项目的字段。
<tr ng-repeat="obj in projectslist">
<td>{{ obj.field1}}</td>
<td>{{ obj.field2 }}</td>
<td>{{ obj.field3 }}</td>
<td>{{ obj.field4 }}</td>
</tr>
问题:
如何将之前从当前用户的数据(使用第一种或第二种方法)获得的项目密钥列表传递到后一个函数中,该函数显示项目并在equalTo() 中按密钥过滤它们?
但如您所见,我将一个项目 ID 手动传递给我的过滤器 equalTo,它正在工作。但是我需要将所有键传递给equalTo。
一种建议的方法是:
一种建议的方法是像这样组合这两个功能:
$scope.projectslist = [];
DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("projects").forEach(function (childSnapshot) {
var userprojects = childSnapshot.val();
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
$scope.projectslist.push($firebaseArray(projectquery));
});
});
但这没有成功!表格显示行,但里面没有值:http://imgur.com/uByHT3c
这是调试器的屏幕截图:http://i.imgur.com/TaDZLlk.png
更新:
这是我的 users 孩子在 firebase mydatabase 中的结构:
您可以在其中看到五个用户,对于每个用户,有多个字段,其中一个是存储用户项目密钥的字段,在此示例中,用户有四个项目密钥。
这是 firebase mydatabase 中的子项目:
在这里,我们看到了我的 firebase 数据库的全局视图。
所以目标是从 users 中查找项目键,然后从项目数据库中显示相应的项目,即 ng-repeat 那些项目的字段。
更新:
这是 Zura 建议后的控制台日志:
$scope.projectslist = [];
DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("projects").forEach(function (childSnapshot) {
var userprojects = childSnapshot.val();
//console.log("loaded. Data: ", userprojects);
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = ($firebaseArray(projectquery));
console.log("list: ", list);
});
});
每个列表都包含我当前用户的每个项目所需的信息。完美的!
但是如何访问它们并将它们存储在 $scope 中以便能够在我的 html 中调用它?
更新:
我只能通过将列表传递给 $scope 来显示最后一个项目:
显示的项目是 forEach 迭代的最后一个。 问题是如何显示 forEach 的所有迭代并将其传递到数组中?
25.10.2016 更新:
这是连接对象的代码的更新版本:第一个,然后是前两个,前三个,最后所有对象连接成一个大数组,请参阅下面的控制台日志:
$scope.projectslist = [];
DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("projects").forEach(function (childSnapshot) {
var userprojects = childSnapshot.val();
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = $firebaseArray(projectquery);
$scope.list = $firebaseArray(projectquery);
console.log("list: ", $scope.list);
list.$loaded(function(){
$scope.projectslist = $scope.projectslist.concat(list);
console.log("loaded: ", $scope.projectslist);
});
});
});
【问题讨论】:
标签: angularjs firebase angularjs-ng-repeat firebase-realtime-database