我在控制器中有以下代码。此代码获取当前用户的任务列表。
我想将它打包成一个有角度的服务,所以我可以随时随地在任何控制器中调用它。示例Task.getList()
在控制器中
$scope.tasks = {};
$firebaseSimpleLogin(instance).$getCurrentUser().then(function(user) {
$firebase(instance).$child('users/' + user.uid + '/tasks/incomplete').$on('child_added', function(taskId) {
$scope.tasks[taskId.snapshot.name] = $firebase(instance).$child('todos/' + taskId.snapshot.name);
});
});
但我在这里面临一个问题。当我在控制器中调用它时。它总是返回undefined
在服务中
getList: function() {
$firebaseSimpleLogin(instance).$getCurrentUser().then(function(user) {
$firebase(instance).$child('users/' + user.uid + '/tasks/incomplete').$on('child_added', function(taskId) {
return $firebase(instance).$child('todos/' + taskId.snapshot.name);
});
});
}
答案 0 :(得分:1)
您可以通过将内容分解为更小的部分来简化此问题。你试图从一个内部回调返回,这是非常棘手的处理。我们可以将这些责任分开,而不是试图让所有东西一下子全部加载。
处理此问题的一个好方法是分离出auth代码($ getCurrentUser)和任务代码(getList)。
这是我写的Plunker应用程序的示例。它将为每个登录用户加载任务。
http://plnkr.co/edit/M0UJmm?p=preview
我有一个处理我的身份验证码的Auth工厂。
.factory('Auth', function($firebaseSimpleLogin, Fb, $rootScope) {
var simpleLogin = $firebaseSimpleLogin(Fb);
return {
getCurrentUser: function() {
return simpleLogin.$getCurrentUser();
},
// see plunker for the rest
};
})
我还有一个 TaskStore ,用于处理用户任务的添加,删除和同步。商店会使用用户的ID进行初始化。然后它将知道如何获取用户列出的任务。
然后在我的控制器中,我可以一起使用这些来加载用户的任务。在$ getCurrentUser函数返回的promise中,具有用户id的TaskStore可以初始化。
这样我的TaskStore可以重复使用,独立于我的Auth代码,而且更容易管理。