如何在角度服务中返回angularFire $ on value?

时间:2014-06-25 07:46:07

标签: javascript angularjs firebase angularfire

我在控制器中有以下代码。此代码获取当前用户的任务列表。 我想将它打包成一个有角度的服务,所以我可以随时随地在任何控制器中调用它。示例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);
  });
 });
}

1 个答案:

答案 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代码,而且更容易管理。