令人困惑的Firebase阵列概念以及何时正确使用它

时间:2015-08-25 22:07:00

标签: angularjs firebase angularfire

所以我有一个控制器来加载所有任务,例如:

 $scope.tasks = taskService.all;
 $scope.tasks.$loaded().then(function(data){
        console.log (data);
 });

  //--------Destroy all the AngularFire connection------//
  $scope.$on("$destroy", function(){
        $scope.tasks.$destroy();
    });

taskService如下:

    var ref = new Firebase(FirebaseUrl);
    var tasks = $firebaseArray(ref.child('tasks'));
    var uid = Users.LoginUserId();

    var Task = {

        all: tasks,

        getAllTasks: function() {
            console.log ("Run get All tasks.");
            return $firebaseArray(ref.child('tasks'));
        },
    ... ...
    ...

使用$ scope.tasks = taskService.all;我想我正在获得一个任务数组 - 这是一个firebaseArray。当我使用Auth。$ unauth()注销时,没有权限错误。当我重新登录并转到同一视图时,$ scope.tasks是一个空数组= []。我不知道为什么taskService不会再次获取firebaseArray的任务。当我强制刷新浏览器时,它只会获取firebase数组。

如果我使用

$scope.tasks = taskService.getAllTasks();
taskService中的

- 返回firebaseArray的方法/函数。在我注销并重新登录之后,这个任务将不会是空数组。但是我可以告诉我何时注销,有很多权限错误 - 看起来每次我来到这个视图时都有很多firebaseArray(浪费资源)任务数组有多个相同的副本?!?)

那么处理它的正确方法是什么?为什么在我的应用程序中导航并回到相同的视图时,在服务/工厂中使用方法会产生多个重复的firebaseAarray?这真的很糟糕吗?为什么使用factory.value方式会在注销并重新登录时引起问题?我找不到任何明确的解释。 Firebase专家请帮忙。

编辑最终解决方案:

感谢@nicolas,这是我的最终解决方案: 由此,nicolas提供的代码无法解决我的解决方案。$$ tasks = []仍然是正确的。它不是NULL。它只是一个空数组。所以我必须这样做:

getAllTasks: function() {

            if (tasks.length == 0) {
                console.log ("Logout and Log back in. Tasks is empty!");
                tasks = $firebaseArray(ref.child('tasks'));
            } else {
                console.log ("Navigate around. Tasks is NOT empty!");
                tasks = tasks;
            }
            return tasks;
        },

任务已经在工厂内,而且是私有的。我不认为我需要使用$$。

1 个答案:

答案 0 :(得分:3)

当你注销时,你应该基本上在所有的angularfire实例上调用$ destroy,因为每个实例都会保持一些套接字打开。因此,如果您根据当前用户ID设置了一些安全规则并注销,则可能会破坏它们并获得异常。

参考你的任务服务,我会在实例化后缓存数组(因为firebase会自动同步它),并监听child_added事件。

var Task = {
  getAllTasks: function() {
    this.$$tasks = (this.$$tasks || firebaseArray(ref.child('tasks')));
    return this.$$tasks;
}