迭代一个firebase集合

时间:2015-01-26 15:47:38

标签: angularjs firebase angularfire

我有一组存储在firebase中的项目,item对象有两个属性,name和selected。 我将所有项目打印到视图中,每个项目都有一个复选框,将selected属性更改为true。 我底部还有一个按钮,它有一个绑定到它的功能,deleteSelected()。

我的想法是以某种方式迭代firebase对象,然后检查它们是否具有selected = true属性,然后删除这些项。我尝试在firebase对象上使用$ asObject()函数,但是出现了这个错误。

TypeError: undefined is not a function
 at new <anonymous> (controllers.js:17)
 at invoke (angular.js:3374)
 at Object.instantiate (angular.js:3386)
 at $get (angular.js:5902)
 at angular.js:5400
 at forEach (angular.js:220)
 at nodeLinkFn (angular.js:5387)
 at compositeLinkFn (angular.js:4911)
 at compositeLinkFn (angular.js:4914)
 at publicLinkFn (angular.js:4819)

如何迭代firebase对象?或者有更简单的方法来解决这个问题吗?

如果您想查看以下代码:Plunker

var firebaseRef = new Firebase("https://inkopslista.firebaseio.com/items");
//creates a firebase object that takes a reference to the firebase URL
var items = $firebase(firebaseRef);

$scope.items = items;

这是通过ng-click绑定到按钮的功能。

$scope.deleteSelected = function(){

    for(var i=0; i < items.length; i++){

        if(items[i].selected === true){
            console.log(items[i]);
        }
    }
};    

1 个答案:

答案 0 :(得分:2)

如果您的Firebase中有类似阵列的结构,则应致电$asArray而不是$asObject。 AngularFire的FirebaseArray类(这是$asArray返回的内容)在幕后做了大量工作,以确保Firebase的有序集合很好地映射到JavaScript数组中(这就是AngularJS期待)。

从您的plunker修改:

var firebaseRef = new Firebase("https://your.firebaseio.com/items");

//creates a firebase object that takes a reference to the firebase URL
var items = $firebase(firebaseRef);

$scope.items = items.$asArray();

$scope.items.$loaded().then(function(array) {
    console.log('Initial items received from Firebase', array.length);
});

另见:Unable to get length of Firebase Objects

更新

您似乎使用的是旧版本的Firebase和AngularFire。在版本0.8中,阵列式结构的处理得到了显着改善。如果您没有升级,那么您最终会复制最近版本中引入的大量代码。

为了给你一些想法,我很快就把你的控制器和视图放到一个jsbin中,并使它适用于最新版本的AngularJS,Firebase和AngularFire。

.controller("MainController", ["$scope", "$firebase", "$filter" , function($scope, $firebase, $filter){
    var firebaseRef = new Firebase("https://inkopslista.firebaseio.com/items");
    var items = $firebase(firebaseRef);
    $scope.items = items.$asArray();

    $scope.addItem = function(item){
        if(item === undefined){
            return null;
        }else{
            item.selected = false;
            $scope.items.$add(item);
        }    
        $scope.newItem = null;
    };


    $scope.deleteItem = function(id){
        $scope.items.$remove(id);
    };

    $scope.deleteSelected = function(){
        $scope.items.forEach(function(item) {
            if (item.selected) {
                $scope.items.$remove(item);
            }
        });
    };
}]);  

jsbin:http://jsbin.com/varoka/1/edit?html,js,output