我有一组存储在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]);
}
}
};
答案 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);
}
});
};
}]);