我有存储在Firebase中的数组,其中一个我需要在用户登录时检索。每个用户都有自己的数组,需要进行身份验证才能读取。 (切换到另一个数据结构会很不方便)。由于$firebase()
始终返回一个对象as per the docs,因此我使用orderByPriority
过滤器。但是,如果我只是
$scope.songs = $filter('orderByPriority')($firebase(myref));
不能用作songs
总是得到一个空数组。
我不明白为什么会发生这种情况,但我要解决的问题是使用$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,因此可以通过拖放重新排序HTML UL
,这似乎需要一个数组)。
对于应用程序的这一部分,我不需要与服务器实时同步。我有一个保存按钮,可以触发使用上面的$scope.save
方法。
答案 0 :(得分:1)
上述方法的问题在于orderByPriority生成数据的单个副本。它是空的,因为$ firebase还没有完成从服务器检索结果。
如果您要等待loaded
事件,它将包含数据:
var data = $firebase(myref);
data.$on('loaded', function() {
$scope.songs = $filter('orderByPriority')(data);
});
然而,它仍然不会同步。您需要注意更改并在每次更改事件后更新它(当您将orderByPriority用作DOM /视图的一部分时,这会自动发生。)
var data = $firebase(myref);
data.$on('change', function() {
$scope.songs = $filter('orderByPriority')(data);
});
请注意,0.8版本将有一个$ asArray(),它将更接近你想要的。此外,you should avoid arrays most of the time。