Angularjs 这是使用$firebase()检索数组的最佳方法吗?
我在Firebase中存储了数组,当用户登录时,我需要检索其中一个数组。每个用户都有自己的数组,需要对读取进行身份验证。(切换到其他数据结构会很不方便)。因为Angularjs 这是使用$firebase()检索数组的最佳方法吗?,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我在Firebase中存储了数组,当用户登录时,我需要检索其中一个数组。每个用户都有自己的数组,需要对读取进行身份验证。(切换到其他数据结构会很不方便)。因为$firebase()总是返回一个对象,所以我使用orderByPriority过滤器。然而,如果我只是 $scope.songs = $filter('orderByPriority')($firebase(myref)); 这不起作用,因为歌曲总是得到一个空数组 我不明白为什么会发生这种情况,但我所做的是使用$firebase().$
$firebase()
总是返回一个对象,所以我使用orderByPriority
过滤器。然而,如果我只是
$scope.songs = $filter('orderByPriority')($firebase(myref));
这不起作用,因为歌曲
总是得到一个空数组
我不明白为什么会发生这种情况,但我所做的是使用$firebase().$on('loaded',cb)
表单并在回调中应用过滤器。这是一个好的解决方案吗
缺点是我无法执行$scope.songs.$save()
这是我的控制器,包括此解决方案:
.controller('songListController', function($scope, $rootScope, $firebase, $filter, $firebaseSimpleLogin){
var authRef = new Firebase('https://my-firebase.firebaseio.com/users'),
dataRef;
$scope.loginObj = $firebaseSimpleLogin(authRef);
$scope.songs = [];
$rootScope.$on("$firebaseSimpleLogin:login", function(event, user) {
// user authenticated with Firebase
dataRef = $firebase(authRef.child(user.id));
dataRef.$on('loaded', function(data){
$scope.songs = $filter('orderByPriority')(data);
});
});
//other controller methods go here
$scope.save = function(){
if (!$scope.loginObj.user)
{
alert('not logged in. login or join.');
return;
}
//Was hoping to do this
//$scope.songs.$save().then(function(error) {
//but having to do this instead:
dataRef.$set($scope.songs).then(function(error) {
if (error) {
alert('Data could not be saved.' + error);
} else {
alert('Data saved successfully.');
}
});
};
});
---根据加藤的回答进行编辑---
我的应用程序的这一部分使用Firebase作为一个简单的CRUD json存储,没有任何实时方面。我使用$set
来存储更改,所以我认为我可以使用数组。(我正在使用jQueryUI的Sortable,以便可以通过拖放对HTMLUL
进行重新排序,这似乎需要一个数组)。
对于应用程序的这一部分,我不需要与服务器进行实时同步。我有一个保存按钮,它触发了上面的
$scope.save
方法的使用。上述方法的问题是orderByPriority生成数据的单个副本。它为空,因为$firebase尚未完成从服务器检索结果
如果要等待加载的事件,它将包含以下数据:
var data = $firebase(myref);
data.$on('loaded', function() {
$scope.songs = $filter('orderByPriority')(data);
});
但是,它仍然不会被同步。您需要监视更改并在每次更改事件后更新它(当您将orderByPriority用作DOM/view的一部分时,会自动发生这种情况)
请注意,0.8版本将有一个$asArray(),它将更接近您在这里想要的。另外,.对不起,我应该考虑添加更多信息。请参阅有问题的编辑。
var data = $firebase(myref);
data.$on('change', function() {
$scope.songs = $filter('orderByPriority')(data);
});