这是使用$ firebase()检索数组的最佳方法吗?

时间:2014-05-23 20:43:02

标签: angularjs firebase angularfire

我有存储在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方法。

1 个答案:

答案 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