【问题标题】:AngularJS Firebase database query filter based on other database基于其他数据库的AngularJS Firebase数据库查询过滤器
【发布时间】: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


    【解决方案1】:

    建议

    • 如果可能,请始终使用 angularfire 与原始 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 并获取对象并将其推送到数组中。

    2016 年 10 月 25 日更新:

    现在你的问题就在这里。

    DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
        .then(function onSuccess(snapshot) {
            snapshot.child("projects").forEach(function (childSnapshot) {
    

    这不是我的建议。您没有使用 angularfire 并且 html 不会自动重新编译。你应该在onSuccess promise 或更好的结尾调用$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){
    

    【讨论】:

    • 我的第一个问题是您最后一行附加到列表中的 contact 是什么?它从哪里来的?它有什么作用?我在问题的原始代码中没有它。其次,我试图实施您的答案,但没有成功。当我实现你的第二个代码时,我收到关于 user 重复声明的警告。您能否重新审视您的答案,如果您有任何建议,请告诉我?
    • 我添加了我的数据库结构的请求截图。
    • 你的意思是 concat by contact,连接?无论如何,我也尝试过,但没有成功。
    • 我用您的建议替换了$scope.projectslist.push($firebaseArray(projectquery));var list = $firebaseArray(projectquery); list 包含我需要的内容!但它们存储在每个数组的 [0] 处。如何连接它们?这是我添加到问题中的 list 的控制台日志..
    • 是的,它应该是 concat 而不是 contact。很抱歉这个拼写错误。并在连接后返回新数组而不是修改现有数组。检查我更新的答案。
    猜你喜欢
    • 2014-08-25
    • 2019-05-11
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多