2

我试图获得一个简单的数组的长度,但angularFireCollection似乎无法:

var stf = new FireBase("http://myfirebase-app.firebaseio.com/staff");

function staffListCtrl($scope, angularFireCollection){
    $scope.staff = angularFireCollection(stf);
    console.log($scope.staff.length);
}

控制台中的输出显示:

0

我知道这是不正确的。它应该返回大约 5 作为长度(请参阅下面的屏幕截图以获取$scope.staff.

$scope.staff 的输出

感谢任何帮助,因为我似乎无法完成这个绝对、完全简单的 JS 任务。

4

3 回答 3

1

在这种情况下,在回调中打印检索到的元素数量的正确方法如下:

var stf = new FireBase("http://myfirebase-app.firebaseio.com/staff");
function staffListCtrl($scope, angularFireCollection) {
    $scope.staff = angularFireCollection(stf, function() {
        console.log(stf.numChildren());
    });
}  

这样做的原因是在实际分配给 $scope.staff之前调用了初始回调函数。因此,在回调函数中,您只能访问 Firebase DataSnapshot 对象stf。希望这可以帮助。

于 2013-09-27T07:02:35.727 回答
0

您试图在调用后立即访问长度angularFireCollection,但实际数据是通过网络检索的,因此更新数组需要一些时间。您可以将函数作为参数传递给 angularFireCollection,以便在加载初始数据时得到通知,如下所示:

var stf = new FireBase("http://myfirebase-app.firebaseio.com/staff");
function staffListCtrl($scope, angularFireCollection) {
  $scope.staff = angularFireCollection(stf, function() {
    console.log($scope.staff.length);
  });
}   
于 2013-09-10T23:40:30.320 回答
0

啊,我在 angularfire.js 中看到它。第 298 行包含在 $timeout 中添加项目。这导致 initalCb() 在数据添加到集合之前被调用。我拉了 $timeout 并且它起作用了。但是,我不得不调用 $scope.$apply() 来反映添加的项目。我最终将范围传递给 angularFireCollection 以确保 $apply() 被调用。不知道我通过拉超时还打破了什么。

这是对该问题的看法:plunkr

编辑:据我所知并在 plunkr 中显示,这是行不通的。

$scope.staff = angularFireCollection(stf, function() {
    console.log($scope.staff.length);
});

虽然从 angularfire.js 中提取 $timeout 确实解决了这个特定问题,但它引起了数据绑定的各种其他问题(如预期的那样),所以我把它放回去了。似乎要走的路是使用回调中传递的快照。我找不到很多关于它的文档,但这对我有用:

$scope.staff = angularFireCollection(stf, function(snapshot) {
    angular.forEach(snapshot, function(item){
        //will let you iterate through the data in the snapshot
    });
});
于 2013-09-28T07:28:25.570 回答