基于其他数据库的AngularJS Firebase数据库查询过滤器

基于其他数据库的AngularJS Firebase数据库查询过滤器,angularjs,firebase,angularjs-ng-repeat,firebase-realtime-database,Angularjs,Firebase,Angularjs Ng Repeat,Firebase Realtime Database,我获取存储在Firebase数据库中名为用户的当前用户数据下的“项目”字段中的值: 第一种方法: var promise = MyUser.user(); promise.then( function onSuccess(user) { $scope.userprojectskeys = user.projects; }); var keyquery = DatabaseRef.ref('/users/' + userId).orderByKey().once("value")

我获取存储在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 );
        });
    });
第二种方法:

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>
但这是没有成功的!该表显示了行,但其中没有值:
以下是调试器的屏幕截图:

更新: 以下是firebase中mydatabase中我的
用户的子级结构:

其中您可以看到五个用户,对于每个用户,有许多字段,其中一个字段存储用户项目键,在本例中,用户有四个项目键


这是firebasemydatabase中的项目子项:

这里我们可以看到我的firebase数据库的全局视图。 因此,目标是从用户中查找项目键,然后从项目数据库中显示相应的项目,即重复这些项目的字段

更新: 以下是祖拉建议后的控制台日志:

$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的所有迭代并将其传递到数组中?

2016年10月25日更新: 下面是连接对象的代码的更新版本:首先是一个,然后是前两个,前三个,最后是连接到一个大数组中的所有对象,请参见下面的控制台日志:

 $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);
            });

        });
    });


每个对象都直接包含我需要的信息,如前一个对象屏幕截图所示。

推荐
  • 如果可能,请始终使用vs原始firebase 承诺。三向绑定+
    $scope.$apply
    自动地所以你不必去想它

  • 如果正在获取,请使用
    $firebaseObject
    而不是
    $firebaseArray
    只有一个对象

  • 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));
        });
    });
    
------------------------------------------------------------------------------------------------------------------------------------

您的问题在以下代码中

$scope.projectslist.push($firebaseArray(projectquery));
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = $firebaseArray(projectquery);
list.$loaded(function(){
    $scope.projectslist.contact(list);
});
firebaseArray()
返回数组,
push
方法所做的是将给定参数推送到数组的末尾。这里有一个数组,它也包含数组
相反,您希望使用
$firebaseArray(projectquery)
连接现有阵列

我建议尝试以下代码

$scope.projectslist.push($firebaseArray(projectquery));
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = $firebaseArray(projectquery);
list.$loaded(function(){
    $scope.projectslist.contact(list);
});
如果您正在使用,我认为您也应该使用
$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
并获取对象并将其推送到数组中

2016年10月25日更新: 现在你的问题来了

DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
    .then(function onSuccess(snapshot) {
        snapshot.child("projects").forEach(function (childSnapshot) {
这不是按照我的建议做的。您没有使用angularfire,html不会自动重新编译。您应该在成功
promise或更高版本的
onSuccess的末尾调用
$scope.$apply
。。。您应该使用angularfire方法-
$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){

我的第一个问题是,在列表的最后一行中,联系人是什么?它是从哪里来的?它有什么作用?我在问题的原始代码中没有。第二,我试图实现你的答案,但没有成功。当我实现您的第二个代码时,我会收到关于用户重复声明的警告。你能重温一下你的答案并告诉我你有什么建议吗?我添加了我的数据库结构的截图。你是说通过联系来连接吗?无论如何,我也尝试过这个,但没有成功。我替换了
$scope.projectslist.push($firebaseArray(projectquery))根据您的建议:
var list=$firebaseArray(projectquery)列表包含我需要的内容!但它们存储在每个数组的[0]处。如何连接它们?这是我添加到问题中的列表的控制台日志。是的,它应该是concat而不是contact。对不起,这个打字错误。在连接之后,它返回新数组,而不是修改现有数组。检查我的最新答案。