angularFireCollection不返回任何数据

时间:2013-12-05 22:07:36

标签: firebase angularfire

使用隐式更新(angelFire)时没有问题。但是我需要一些我的数据使用显式更新。所以我在之前使用的完全相同的ref上实现了angelFireCollection但是尽管console.log明确说明了读取被授予并且使用onloadcallback并且没有使用它,我没有得到数据直接进入我指定的变量AND一旦回调触发我得到一个奇怪的外观对象,它包含数据但不是我期望的形式。我的范围变量以空集合结束。从来没有人口稠密。这是代码:

    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工厂函数中设置了止值,并且可以看到数据已添加到该函数内部回调中的集合中,但我的binded变量永远不会更新。

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

1 个答案:

答案 0 :(得分:0)

确定。因此看起来确实angularFireCollection是基于数组的。哪个好。如果更新angularFire文档以使其清楚,那将非常有用。因此,它不是隐式vs显式更新技术。

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

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