所以我有一个控制器来加载所有任务,例如:
$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;
},
任务已经在工厂内,而且是私有的。我不认为我需要使用$$。
答案 0 :(得分:3)
当你注销时,你应该基本上在所有的angularfire实例上调用$ destroy,因为每个实例都会保持一些套接字打开。因此,如果您根据当前用户ID设置了一些安全规则并注销,则可能会破坏它们并获得异常。
参考你的任务服务,我会在实例化后缓存数组(因为firebase会自动同步它),并监听child_added事件。
var Task = {
getAllTasks: function() {
this.$$tasks = (this.$$tasks || firebaseArray(ref.child('tasks')));
return this.$$tasks;
}