我在Firebase数据库中名为用户的当前用户数据下的“项目”字段中存储了值:
第一种方法:
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
都返回所需的数据:
第一种方法输出:
第二种方法输出:
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);
我现在正在做的是重复$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
这是firebase中 mydatabase 中users
子项的结构:
在其中您可以看到五个用户,并且对于每个用户,有许多字段,其中一个是存储用户项目键的字段,在此示例中,用户有四个项目键。
这是firebase mydatabase 中的项目子项:
这里我们看到我的firebase数据库的全局视图。
因此,目标是从用户中查找项目键,然后从项目数据库中显示相应的项目,即重复这些项目的字段。
这是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的所有迭代并将其传递给数组?
这里是连接对象的代码的更新版本:第一个,然后是前两个,前三个,最后所有对象连接成一个大数组,请参阅下面的控制台日志:
$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);
});
});
});
答案 0 :(得分:2)
如有可能,请始终使用angularfire vs原始firebase
承诺。 AngularFire执行3路绑定+ $scope.$apply
自动。所以你不必考虑它。
如果您要提取,请使用$firebaseObject
代替$firebaseArray
只有一个对象。
----------------------------------------------- -------------------------------------------------- -----------------------------------
您的问题在以下代码中。
$scope.projectslist.push($firebaseArray(projectquery));
firebaseArray()
返回数组,push
方法做的是它在数组末尾推送给定参数。所以在这里,你将拥有包含数组的数组。
相反,您希望使用$firebaseArray(projectquery)
连接现有数组。
我建议尝试以下代码。
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = $firebaseArray(projectquery);
list.$loaded(function(){
$scope.projectslist.contact(list);
});
如果您使用angularfire,我认为您应该使用$firebaseObject
修改提取用户的项目。而且您不需要使用orderByKey
,因为您只获取一个对象。
var user = $firebaseObject(DatabaseRef.ref('/users/' + userId));
user.$loaded(function(){
console.log("User loaded. Data: ", user);
angular.forEach(user.projects, function(value, key){
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(key);
// var list = $firebaseArray(projectquery);
// list.$loaded(function(){
// $scope.projectslist = $scope.projectslist.concat(list);
// });
// or shortly. Replace 4 lines above with this line.
$scope.projectslist.push($firebaseObject(projectquery));
});
});
由于您只获得一个列表,最好尝试$firebaseObject
并获取对象并将其推送到数组中。
现在你的问题就在这里。
DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("projects").forEach(function (childSnapshot) {
这不是根据我的建议完成的。您没有使用angularfire,并且不会自动重新编译html。您应该在$scope.$apply
承诺或更好的结尾处致电onSuccess
...您应该使用角火法 - $firebaseObject
自动调用$scope.$apply
。
var user = $firebaseObject(DatabaseRef.ref('/users/' + userId));
user.$loaded(function(){
console.log("User loaded. Data: ", user);
angular.forEach(user.projects, function(value, key){