混淆 Firebase Array 概念以及何时正确使用它
Confusing Firebase Array concept and when how to correctly use it
所以我有一个控制器来加载所有任务,例如:
$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();
});
任务服务如下:
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 中 - return firebaseArray 的方法/函数。在我注销并重新登录后,此任务不会为空数组。但是我可以告诉我,当我注销时,有很多权限错误 - 看起来每次我来到这个视图时都有很多 firebaseArray(因为资源浪费有多个相同的任务数组副本?!?)
那么哪种处理方式才是正确的呢?为什么在 services/factory 中使用方法会在我浏览我的应用程序并返回到相同视图时产生多个重复的 firebaseAarray?那真的很糟糕吗?为什么使用 factory.value 方式会导致注销和重新登录时出现问题?我找不到任何明确的解释。 Firebase 专家请帮忙。
编辑最终解决方案:
感谢@nicolas 这是我的最终解决方案:
nicolas 提供的代码无法用于我的解决方案,因为 this.$$tasks = [] 仍然为真。它不是空的。它只是一个空数组。所以我必须改为这样做:
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;
},
tasks 已经在一个工厂中并且是私有的。我认为我不需要使用 $$。
当您注销时,您基本上应该在所有 angularfire 实例上调用 $destroy,因为它们中的每一个都保持一些套接字打开。因此,如果您根据当前用户 ID 设置了一些安全规则并注销,则可能会破坏它们并获得异常。
关于您的任务服务,我会在实例化后缓存数组(因为 firebase 会自动同步它),并监听 child_added 事件。
var Task = {
getAllTasks: function() {
this.$$tasks = (this.$$tasks || firebaseArray(ref.child('tasks')));
return this.$$tasks;
}
所以我有一个控制器来加载所有任务,例如:
$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();
});
任务服务如下:
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 中 - return firebaseArray 的方法/函数。在我注销并重新登录后,此任务不会为空数组。但是我可以告诉我,当我注销时,有很多权限错误 - 看起来每次我来到这个视图时都有很多 firebaseArray(因为资源浪费有多个相同的任务数组副本?!?)
那么哪种处理方式才是正确的呢?为什么在 services/factory 中使用方法会在我浏览我的应用程序并返回到相同视图时产生多个重复的 firebaseAarray?那真的很糟糕吗?为什么使用 factory.value 方式会导致注销和重新登录时出现问题?我找不到任何明确的解释。 Firebase 专家请帮忙。
编辑最终解决方案:
感谢@nicolas 这是我的最终解决方案: nicolas 提供的代码无法用于我的解决方案,因为 this.$$tasks = [] 仍然为真。它不是空的。它只是一个空数组。所以我必须改为这样做:
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;
},
tasks 已经在一个工厂中并且是私有的。我认为我不需要使用 $$。
当您注销时,您基本上应该在所有 angularfire 实例上调用 $destroy,因为它们中的每一个都保持一些套接字打开。因此,如果您根据当前用户 ID 设置了一些安全规则并注销,则可能会破坏它们并获得异常。
关于您的任务服务,我会在实例化后缓存数组(因为 firebase 会自动同步它),并监听 child_added 事件。
var Task = {
getAllTasks: function() {
this.$$tasks = (this.$$tasks || firebaseArray(ref.child('tasks')));
return this.$$tasks;
}