【问题标题】:angularFireCollection is not returning any dataangularFireCollection 不返回任何数据
【发布时间】:2013-12-06 21:21:52
【问题描述】:

我在使用隐式更新 (angelFire) 时没有任何问题。但是我需要我的一些数据使用显式更新。所以我在我之前使用的完全相同的 ref 上实现了angelFireCollection,但尽管 console.log 明确表示读取已被授予并尝试使用onloadcallback 和没有,我不会将数据直接输入我的分配的变量,一旦回调触发,我得到一个看起来很奇怪的对象,它包含数据但不是我期望的形式。我的范围变量以一个空集合结束。永远不会被填充。代码如下:

    var streamController = function ($rootScope, $scope, $log, $location, angularFireCollection,  profileService) {
    //Wait for firebaseLogin...
    $rootScope.$watch('firebaseAuth', init);      

    function init() {
        if ($rootScope.firebaseAuth == false) {
            return
        };       
        var refUsers = new Firebase($rootScope.FBURL+'/users/'+$rootScope.uid);
        $scope.profile = angularFireCollection(refUsers, function onload(snapshot) {
            console.log(snapshot)                
        });

     };
  };

  myApp.gwWebApp.controller('StreamController', ['$rootScope', '$scope', '$log', '$location', 'angularFireCollection', 'profileService',
    streamController]);

}());

这是 console.log 的样子(即快照的样子):

>snapshot
T {z: R, bc: J, V: function, val: function, xd: function…}

这是返回快照之前的较早消息:

Firebase Login Succeeded! fbLoginController.js:16
FIREBASE: Attempt to read /users/529ccc5d1946a93656320b0a with auth={"username":"xxxxxxx@me.com","id":"529ccc5d1946a93656320b0a"} firebase.js:76
FIREBASE:   /: "auth.username == 'admin'" firebase.js:76
FIREBASE:       => false firebase.js:76
FIREBASE:   /users firebase.js:76
FIREBASE:   /users/529ccc5d1946a93656320b0a: "auth.id == $user" firebase.js:76
FIREBASE:       => true firebase.js:76
FIREBASE: 
FIREBASE: Read was allowed. 

最后是所需的以空数组结尾的绑定:再次来自控制台:

$scope.profile []

有人知道我可能做错了什么吗?这就像 5 行代码。令人沮丧。

我在 angelFireCollection 工厂函数中设置了停止,并且可以看到数据被添加到该函数内的回调中的集合中,但我的绑定变量永远不会更新。

更新 好的,尝试使用 plnkr。似乎angularFireCollection 期望您返回一个项目列表。如果您检查snapshot.val(),快照将正确返回,它将是存储在 firebase 中的任何对象结构。如果您使用angularFireCollection,它确实绑定到变量但是它将非列表对象变成乱码,并且您无法使用普通点运算符访问对象用户。这要么是一个错误,要么是 angularFireCollection 的严重限制,这将导致我重新评估我可以轻松地将 firebase 用作后端。我无法共享我的 plnkr,因为它正在访问非公共数据,但明天如果我有时间,我将创建一个带有对象存储的公共 firebase 并进行演示。

【问题讨论】:

    标签: firebase angularfire


    【解决方案1】:

    好的。所以看起来确实 angularFireCollection 是基于数组的。这很好。如果更新了 angularFire 文档以明确这一点,那将非常有帮助。因此,它不是隐式与显式更新技术。

    对于显式的非基于数组的方法,我提出了以下代码。如果我没有被文档误导,我最初会走这条路。

    var MainCtrl = function($scope, angularFire) {
       $scope.test = {};
       var _url = 'https://golfwire.firebaseio.com/tmp';
       var _ref = new Firebase(_url);
       var promise = angularFire(_ref, $scope, 'implicit');
       promise.then ( function(data){
          $scope.explicit=angular.copy($scope.implicit );
       }); 
    } 
    

    然后,您可以在本地使用“显式”副本,并在准备好后通过分配:$scope.implicit = $scope.explicit 来更新“隐式”。

    这是一个plnkr:http://plnkr.co/edit/bLJrL1

    【讨论】:

    • 您可能需要关注 v2. angularfire.com/documentationv2.html 它目前处于 rc 阶段,但感觉更透明。它总是返回对象并且有一个内置的 orderByPriority 过滤器来为像 ng-repeat 这样的东西创建数组。
    猜你喜欢
    • 2017-11-23
    • 2021-12-13
    • 2016-12-06
    • 2011-04-04
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多